rr 0.9.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +4 -0
- data/README.rdoc +3 -3
- data/VERSION.yml +2 -2
- data/lib/rr/adapters/rr_methods.rb +1 -1
- data/lib/rr/double.rb +2 -2
- data/lib/rr/double_injection.rb +15 -39
- data/lib/rr/space.rb +1 -1
- data/spec/rr/double_injection/double_injection_bind_spec.rb +26 -64
- data/spec/rr/double_injection/double_injection_has_original_method_spec.rb +42 -39
- data/spec/rr/double_injection/double_injection_reset_spec.rb +24 -42
- data/spec/rr/double_injection/double_injection_spec.rb +5 -28
- data/spec/rr/space/space_spec.rb +18 -10
- metadata +2 -2
data/CHANGES
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
* 0.10.0
|
2
|
+
- Method is no longer invoked if respond_to? returns false. This was in place to support ActiveRecord association proxies, and is no longer needed.
|
3
|
+
|
4
|
+
* 0.9.0
|
1
5
|
- instance_of Doubles now apply to methods invoked in the subject's #initialize method.
|
2
6
|
|
3
7
|
* 0.8.1
|
data/README.rdoc
CHANGED
@@ -32,7 +32,7 @@ Currently RR implements mocks, stubs, proxies, and spies. Fakes usually require
|
|
32
32
|
end
|
33
33
|
|
34
34
|
=== rspec
|
35
|
-
Spec::
|
35
|
+
Spec::Runner.configure do |config|
|
36
36
|
config.mock_with :rr
|
37
37
|
# or if that doesn't work due to a version incompatibility
|
38
38
|
# config.mock_with RR::Adapters::Rspec
|
@@ -316,7 +316,7 @@ to making it possible. We all are standing on the shoulders of giants.
|
|
316
316
|
* Aslak Hellesoy for Developing Rspec
|
317
317
|
* Dan North for syntax ideas
|
318
318
|
* Dave Astels for some BDD inspiration
|
319
|
-
* David Chelimsky for encouragement to make the RR framework, for developing the Rspec mock framework,
|
319
|
+
* David Chelimsky for encouragement to make the RR framework, for developing the Rspec mock framework, syntax ideas, and patches
|
320
320
|
* Daniel Sudol for identifing performance issues with RR
|
321
321
|
* Felix Morio for pairing with me
|
322
322
|
* Gerard Meszaros for his excellent book "xUnit Test Patterns"
|
@@ -324,7 +324,7 @@ to making it possible. We all are standing on the shoulders of giants.
|
|
324
324
|
* Jeff Whitmire for documentation suggestions
|
325
325
|
* Jim Weirich for developing Flexmock, the first Terse ruby mock framework in Ruby
|
326
326
|
* Joe Ferris for patches
|
327
|
-
* Matthew O'
|
327
|
+
* Matthew O'Connor for patches and pairing with me
|
328
328
|
* Michael Niessner for patches and pairing with me
|
329
329
|
* Mike Mangino (from Elevated Rails) for patches and pairing with me
|
330
330
|
* Nick Kallen for documentation suggestions, bug reports, and patches
|
data/VERSION.yml
CHANGED
@@ -50,7 +50,7 @@ module RR
|
|
50
50
|
# that succeeds when passed an argument of a certain type.
|
51
51
|
# mock(object).method_name(is_a(String)) {return_value}
|
52
52
|
# object.method_name("A String") # passes
|
53
|
-
|
53
|
+
def is_a(klass)
|
54
54
|
RR::WildcardMatchers::IsA.new(klass)
|
55
55
|
end
|
56
56
|
|
data/lib/rr/double.rb
CHANGED
@@ -135,12 +135,12 @@ module RR
|
|
135
135
|
end
|
136
136
|
|
137
137
|
def verify_method_signature
|
138
|
-
raise RR::Errors::SubjectDoesNotImplementMethodError unless definition.subject.respond_to?(double_injection.send(:
|
138
|
+
raise RR::Errors::SubjectDoesNotImplementMethodError unless definition.subject.respond_to?(double_injection.send(:original_method_alias_name))
|
139
139
|
raise RR::Errors::SubjectHasDifferentArityError unless arity_matches?
|
140
140
|
end
|
141
141
|
|
142
142
|
def subject_arity
|
143
|
-
definition.subject.method(double_injection.send(:
|
143
|
+
definition.subject.method(double_injection.send(:original_method_alias_name)).arity
|
144
144
|
end
|
145
145
|
|
146
146
|
def subject_accepts_only_varargs?
|
data/lib/rr/double_injection.rb
CHANGED
@@ -5,21 +5,14 @@ module RR
|
|
5
5
|
class DoubleInjection
|
6
6
|
include Space::Reader
|
7
7
|
MethodArguments = Struct.new(:arguments, :block)
|
8
|
-
attr_reader :subject, :method_name, :doubles
|
9
|
-
|
10
|
-
def initialize(subject, method_name)
|
8
|
+
attr_reader :subject, :method_name, :doubles, :subject_class
|
9
|
+
|
10
|
+
def initialize(subject, method_name, subject_class)
|
11
11
|
@subject = subject
|
12
|
+
@subject_class = subject_class
|
12
13
|
@method_name = method_name.to_sym
|
13
14
|
if object_has_method?(method_name)
|
14
|
-
|
15
|
-
meta.__send__(:alias_method, original_method_name, method_name)
|
16
|
-
rescue NameError => e
|
17
|
-
begin
|
18
|
-
subject.send(method_name)
|
19
|
-
meta.__send__(:alias_method, original_method_name, method_name)
|
20
|
-
rescue NameError => e
|
21
|
-
end
|
22
|
-
end
|
15
|
+
subject_class.__send__(:alias_method, original_method_alias_name, method_name)
|
23
16
|
end
|
24
17
|
@doubles = []
|
25
18
|
end
|
@@ -34,14 +27,13 @@ module RR
|
|
34
27
|
# that dispatches to the matching Double when the method
|
35
28
|
# is called.
|
36
29
|
def bind
|
37
|
-
define_implementation_placeholder
|
38
30
|
returns_method = <<-METHOD
|
39
31
|
def #{@method_name}(*args, &block)
|
40
32
|
arguments = MethodArguments.new(args, block)
|
41
|
-
|
33
|
+
RR::Space.double_injection(self, :#{@method_name}).call_method(arguments.arguments, arguments.block)
|
42
34
|
end
|
43
35
|
METHOD
|
44
|
-
|
36
|
+
subject_class.class_eval(returns_method, __FILE__, __LINE__ - 5)
|
45
37
|
self
|
46
38
|
end
|
47
39
|
|
@@ -57,29 +49,20 @@ module RR
|
|
57
49
|
# It binds the original method implementation on the subject
|
58
50
|
# if one exists.
|
59
51
|
def reset
|
60
|
-
meta.__send__(:remove_method, placeholder_name)
|
61
52
|
if object_has_original_method?
|
62
|
-
|
63
|
-
|
53
|
+
subject_class.__send__(:alias_method, @method_name, original_method_alias_name)
|
54
|
+
subject_class.__send__(:remove_method, original_method_alias_name)
|
64
55
|
else
|
65
|
-
|
56
|
+
subject_class.__send__(:remove_method, @method_name)
|
66
57
|
end
|
67
58
|
end
|
68
59
|
|
69
60
|
def call_original_method(*args, &block)
|
70
|
-
@subject.__send__(
|
61
|
+
@subject.__send__(original_method_alias_name, *args, &block)
|
71
62
|
end
|
72
63
|
|
73
64
|
def object_has_original_method?
|
74
|
-
object_has_method?(
|
75
|
-
end
|
76
|
-
|
77
|
-
protected
|
78
|
-
def define_implementation_placeholder
|
79
|
-
me = self
|
80
|
-
meta.__send__(:define_method, placeholder_name) do |arguments|
|
81
|
-
me.__send__(:call_method, arguments.arguments, arguments.block)
|
82
|
-
end
|
65
|
+
object_has_method?(original_method_alias_name)
|
83
66
|
end
|
84
67
|
|
85
68
|
def call_method(args, block)
|
@@ -90,7 +73,8 @@ module RR
|
|
90
73
|
double_not_found_error(*args)
|
91
74
|
end
|
92
75
|
end
|
93
|
-
|
76
|
+
|
77
|
+
protected
|
94
78
|
def find_double_to_attempt(args)
|
95
79
|
matches = DoubleMatches.new(@doubles).find_all_matches(args)
|
96
80
|
|
@@ -127,20 +111,12 @@ module RR
|
|
127
111
|
raise Errors::DoubleNotFoundError, message
|
128
112
|
end
|
129
113
|
|
130
|
-
def
|
131
|
-
"__rr__#{@method_name}"
|
132
|
-
end
|
133
|
-
|
134
|
-
def original_method_name
|
114
|
+
def original_method_alias_name
|
135
115
|
"__rr__original_#{@method_name}"
|
136
116
|
end
|
137
117
|
|
138
118
|
def object_has_method?(method_name)
|
139
119
|
@subject.methods.include?(method_name.to_s) || @subject.respond_to?(method_name)
|
140
120
|
end
|
141
|
-
|
142
|
-
def meta
|
143
|
-
(class << @subject; self; end)
|
144
|
-
end
|
145
121
|
end
|
146
122
|
end
|
data/lib/rr/space.rb
CHANGED
@@ -34,7 +34,7 @@ module RR
|
|
34
34
|
# subject.
|
35
35
|
def double_injection(subject, method_name)
|
36
36
|
@double_injections[subject][method_name.to_sym] ||= begin
|
37
|
-
DoubleInjection.new(subject, method_name.to_sym).bind
|
37
|
+
DoubleInjection.new(subject, method_name.to_sym, (class << subject; self; end)).bind
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
@@ -3,40 +3,31 @@ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
|
|
3
3
|
module RR
|
4
4
|
module DoubleDefinitions
|
5
5
|
describe DoubleInjection do
|
6
|
+
attr_reader :subject, :method_name, :double_injection, :original_method
|
6
7
|
describe "#bind" do
|
7
8
|
context "with an existing method" do
|
8
9
|
before do
|
9
10
|
@subject = Object.new
|
10
11
|
@method_name = :foobar
|
11
|
-
def
|
12
|
+
def subject.foobar;
|
12
13
|
:original_foobar;
|
13
14
|
end
|
14
|
-
@original_method = @subject.method(
|
15
|
-
@subject.methods.should include(
|
16
|
-
@double_injection = DoubleInjection.new(@subject, @method_name)
|
17
|
-
end
|
15
|
+
@original_method = @subject.method(method_name)
|
16
|
+
@subject.methods.should include(method_name.to_s)
|
18
17
|
|
19
|
-
|
20
|
-
@subject.respond_to?(:__rr__foobar).should == false
|
21
|
-
@double_injection.bind
|
22
|
-
@subject.respond_to?(:__rr__foobar).should == true
|
18
|
+
subject.method(:foobar).should == original_method
|
23
19
|
|
24
|
-
|
25
|
-
|
26
|
-
define_method :__rr__foobar do
|
27
|
-
rr_foobar_called = true
|
28
|
-
end
|
29
|
-
end
|
20
|
+
@double_injection = RR::Space.double_injection(subject, method_name)
|
21
|
+
end
|
30
22
|
|
31
|
-
|
32
|
-
|
33
|
-
|
23
|
+
it "overrides the original method with the double_injection's dispatching methods" do
|
24
|
+
double_injection.bind
|
25
|
+
subject.method(:foobar).should_not == original_method
|
34
26
|
end
|
35
27
|
|
36
|
-
it "stores original method in
|
37
|
-
|
38
|
-
|
39
|
-
@subject.method(:__rr__original_foobar).should == @original_method
|
28
|
+
it "stores original method in __rr__original_method_alias_name" do
|
29
|
+
subject.respond_to?(:__rr__original_foobar).should == true
|
30
|
+
subject.method(:__rr__original_foobar).should == original_method
|
40
31
|
end
|
41
32
|
end
|
42
33
|
|
@@ -44,30 +35,16 @@ module RR
|
|
44
35
|
before do
|
45
36
|
@subject = Object.new
|
46
37
|
@method_name = :foobar
|
47
|
-
|
48
|
-
|
38
|
+
subject.methods.should_not include(method_name.to_s)
|
39
|
+
RR::Space.double_injection(subject, method_name)
|
49
40
|
end
|
50
41
|
|
51
42
|
it "creates a new method with the double_injection's dispatching methods" do
|
52
|
-
|
53
|
-
@double_injection.bind
|
54
|
-
@subject.respond_to?(:__rr__foobar).should == true
|
55
|
-
|
56
|
-
rr_foobar_called = false
|
57
|
-
(class << @subject; self; end).class_eval do
|
58
|
-
define_method :__rr__foobar do
|
59
|
-
rr_foobar_called = true
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
rr_foobar_called.should == false
|
64
|
-
@subject.foobar
|
65
|
-
rr_foobar_called.should == true
|
43
|
+
subject.method(method_name).should_not be_nil
|
66
44
|
end
|
67
45
|
|
68
|
-
it "does not create method
|
69
|
-
|
70
|
-
@subject.respond_to?(:__rr__original_foobar).should == false
|
46
|
+
it "does not create method __rr__original_method_alias_name" do
|
47
|
+
subject.respond_to?(:__rr__original_foobar).should == false
|
71
48
|
end
|
72
49
|
end
|
73
50
|
|
@@ -75,34 +52,19 @@ module RR
|
|
75
52
|
before do
|
76
53
|
@subject = Object.new
|
77
54
|
@method_name = :'=='
|
78
|
-
|
79
|
-
@original_method =
|
80
|
-
|
81
|
-
@double_injection =
|
55
|
+
subject.should respond_to(method_name)
|
56
|
+
@original_method = subject.method(method_name)
|
57
|
+
subject.methods.should include(method_name.to_s)
|
58
|
+
@double_injection = RR::Space.double_injection(subject, method_name)
|
82
59
|
end
|
83
60
|
|
84
61
|
it "overrides the original method with the double_injection's dispatching methods" do
|
85
|
-
|
86
|
-
@double_injection.bind
|
87
|
-
@subject.respond_to?(:"__rr__#{@method_name}").should == true
|
88
|
-
|
89
|
-
override_called = false
|
90
|
-
method_name = @method_name
|
91
|
-
(class << @subject; self; end).class_eval do
|
92
|
-
define_method :"__rr__#{method_name}" do
|
93
|
-
override_called = true
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
override_called.should == false
|
98
|
-
@subject == 1
|
99
|
-
override_called.should == true
|
62
|
+
subject.method(method_name).should_not == original_method
|
100
63
|
end
|
101
64
|
|
102
|
-
it "stores original method in
|
103
|
-
|
104
|
-
|
105
|
-
@subject.method(:"__rr__original_#{@method_name}").should == @original_method
|
65
|
+
it "stores original method in __rr__original_method_alias_name" do
|
66
|
+
subject.respond_to?(:"__rr__original_#{method_name}").should == true
|
67
|
+
subject.method(:"__rr__original_#{method_name}").should == original_method
|
106
68
|
end
|
107
69
|
end
|
108
70
|
end
|
@@ -1,55 +1,58 @@
|
|
1
1
|
require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
|
2
2
|
|
3
3
|
module RR
|
4
|
-
describe DoubleInjection
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
4
|
+
describe DoubleInjection do
|
5
|
+
describe "#object_has_original_method?" do
|
6
|
+
attr_reader :subject, :method_name, :double_injection
|
7
|
+
before do
|
8
|
+
@subject = Object.new
|
9
|
+
@method_name = :to_s
|
10
|
+
@double_injection = DoubleInjection.new(subject, method_name, (class << subject; self; end))
|
11
|
+
class << double_injection
|
12
|
+
public :original_method_alias_name
|
13
|
+
end
|
11
14
|
end
|
12
|
-
end
|
13
|
-
|
14
|
-
it "returns true when method is still in object" do
|
15
|
-
@double_injection.bind
|
16
|
-
@double_injection.object_has_original_method?.should be_true
|
17
|
-
end
|
18
15
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
[:__rr_original_to_s]
|
23
|
-
end
|
24
|
-
def @subject.respond_to?(value)
|
25
|
-
true
|
16
|
+
it "returns true when method is still in object" do
|
17
|
+
double_injection.bind
|
18
|
+
double_injection.object_has_original_method?.should be_true
|
26
19
|
end
|
27
20
|
|
28
|
-
|
29
|
-
|
21
|
+
it "returns true when respond_to is true and methods include method" do
|
22
|
+
double_injection.bind
|
23
|
+
def subject.methods
|
24
|
+
[:__rr_original_to_s]
|
25
|
+
end
|
26
|
+
def subject.respond_to?(value)
|
27
|
+
true
|
28
|
+
end
|
30
29
|
|
31
|
-
|
32
|
-
@double_injection.bind
|
33
|
-
def @subject.methods
|
34
|
-
[]
|
35
|
-
end
|
36
|
-
def @subject.respond_to?(value)
|
37
|
-
true
|
30
|
+
double_injection.object_has_original_method?.should be_true
|
38
31
|
end
|
39
32
|
|
40
|
-
|
41
|
-
|
33
|
+
it "returns true when respond_to is true and methods do not include method" do
|
34
|
+
double_injection.bind
|
35
|
+
def subject.methods
|
36
|
+
[]
|
37
|
+
end
|
38
|
+
def subject.respond_to?(value)
|
39
|
+
true
|
40
|
+
end
|
42
41
|
|
43
|
-
|
44
|
-
@double_injection.bind
|
45
|
-
def @subject.methods
|
46
|
-
[]
|
47
|
-
end
|
48
|
-
def @subject.respond_to?(value)
|
49
|
-
false
|
42
|
+
double_injection.object_has_original_method?.should be_true
|
50
43
|
end
|
51
44
|
|
52
|
-
|
45
|
+
it "returns false when respond_to is false and methods do not include method" do
|
46
|
+
double_injection.bind
|
47
|
+
def subject.methods
|
48
|
+
[]
|
49
|
+
end
|
50
|
+
def subject.respond_to?(value)
|
51
|
+
false
|
52
|
+
end
|
53
|
+
|
54
|
+
double_injection.object_has_original_method?.should be_false
|
55
|
+
end
|
53
56
|
end
|
54
57
|
end
|
55
58
|
end
|
@@ -2,84 +2,66 @@ require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
|
|
2
2
|
|
3
3
|
module RR
|
4
4
|
describe DoubleInjection do
|
5
|
-
macro("cleans up by removing the __rr__method") do
|
6
|
-
it "cleans up by removing the __rr__method" do
|
7
|
-
@double_injection.bind
|
8
|
-
@subject.methods.should include("__rr__foobar")
|
9
|
-
|
10
|
-
@double_injection.reset
|
11
|
-
@subject.methods.should_not include("__rr__foobar")
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
5
|
describe "#reset" do
|
6
|
+
attr_reader :subject, :method_name, :double_injection
|
16
7
|
context "when method does not exist" do
|
17
|
-
send("cleans up by removing the __rr__method")
|
18
|
-
|
19
8
|
before do
|
20
9
|
@subject = Object.new
|
21
10
|
@method_name = :foobar
|
22
|
-
|
23
|
-
@double_injection = DoubleInjection.new(
|
11
|
+
subject.methods.should_not include(method_name.to_s)
|
12
|
+
@double_injection = DoubleInjection.new(subject, method_name, (class << subject; self; end))
|
24
13
|
end
|
25
14
|
|
26
15
|
it "removes the method" do
|
27
|
-
|
28
|
-
|
16
|
+
double_injection.bind
|
17
|
+
subject.methods.should include(method_name.to_s)
|
29
18
|
|
30
|
-
|
31
|
-
|
32
|
-
lambda {
|
19
|
+
double_injection.reset
|
20
|
+
subject.methods.should_not include(method_name.to_s)
|
21
|
+
lambda {subject.foobar}.should raise_error(NoMethodError)
|
33
22
|
end
|
34
23
|
end
|
35
24
|
|
36
25
|
context "when method exists" do
|
37
|
-
send("cleans up by removing the __rr__method")
|
38
|
-
|
39
26
|
before do
|
40
27
|
@subject = Object.new
|
41
28
|
@method_name = :foobar
|
42
|
-
def
|
29
|
+
def subject.foobar
|
43
30
|
:original_foobar
|
44
31
|
end
|
45
|
-
|
46
|
-
@original_method =
|
47
|
-
@double_injection =
|
48
|
-
|
49
|
-
@double_injection.bind
|
50
|
-
@subject.methods.should include(@method_name.to_s)
|
32
|
+
subject.methods.should include(method_name.to_s)
|
33
|
+
@original_method = subject.method(method_name)
|
34
|
+
@double_injection = RR::Space.double_injection(subject, method_name)
|
35
|
+
subject.methods.should include(method_name.to_s)
|
51
36
|
end
|
52
37
|
|
53
38
|
it "rebind original method" do
|
54
|
-
|
55
|
-
|
56
|
-
|
39
|
+
double_injection.reset
|
40
|
+
subject.methods.should include(method_name.to_s)
|
41
|
+
subject.foobar.should == :original_foobar
|
57
42
|
end
|
58
43
|
end
|
59
44
|
|
60
45
|
context "when method with block exists" do
|
61
|
-
send("cleans up by removing the __rr__method")
|
62
|
-
|
63
46
|
before do
|
64
47
|
@subject = Object.new
|
65
48
|
@method_name = :foobar
|
66
|
-
def
|
49
|
+
def subject.foobar
|
67
50
|
yield(:original_argument)
|
68
51
|
end
|
69
|
-
|
70
|
-
@original_method =
|
71
|
-
@double_injection =
|
52
|
+
subject.methods.should include(method_name.to_s)
|
53
|
+
@original_method = subject.method(method_name)
|
54
|
+
@double_injection = RR::Space.double_injection(subject, method_name)
|
72
55
|
|
73
|
-
|
74
|
-
@subject.methods.should include(@method_name.to_s)
|
56
|
+
subject.methods.should include(method_name.to_s)
|
75
57
|
end
|
76
58
|
|
77
59
|
it "rebinds original method with block" do
|
78
|
-
|
79
|
-
|
60
|
+
double_injection.reset
|
61
|
+
subject.methods.should include(method_name.to_s)
|
80
62
|
|
81
63
|
original_argument = nil
|
82
|
-
|
64
|
+
subject.foobar do |arg|
|
83
65
|
original_argument = arg
|
84
66
|
end
|
85
67
|
original_argument.should == :original_argument
|
@@ -18,7 +18,7 @@ module RR
|
|
18
18
|
@subject = Object.new
|
19
19
|
@method_name = :foobar
|
20
20
|
subject.methods.should_not include(method_name.to_s)
|
21
|
-
@double_injection = DoubleInjection.new(subject, method_name)
|
21
|
+
@double_injection = DoubleInjection.new(subject, method_name, (class << subject; self; end))
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
@@ -29,7 +29,7 @@ module RR
|
|
29
29
|
@subject = Object.new
|
30
30
|
@method_name = 'foobar'
|
31
31
|
subject.methods.should_not include(method_name)
|
32
|
-
@double_injection = DoubleInjection.new(subject, method_name)
|
32
|
+
@double_injection = DoubleInjection.new(subject, method_name, (class << subject; self; end))
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
@@ -42,7 +42,7 @@ module RR
|
|
42
42
|
|
43
43
|
context "and invoking the method for the first time does not add the method" do
|
44
44
|
before do
|
45
|
-
@double_injection = DoubleInjection.new(subject, method_name)
|
45
|
+
@double_injection = DoubleInjection.new(subject, method_name, (class << subject; self; end))
|
46
46
|
end
|
47
47
|
send("sets up object and method_name")
|
48
48
|
|
@@ -50,29 +50,6 @@ module RR
|
|
50
50
|
double_injection.object_has_original_method?.should be_false
|
51
51
|
end
|
52
52
|
end
|
53
|
-
|
54
|
-
|
55
|
-
context "and invoking the method for the first time adds the method" do
|
56
|
-
before do
|
57
|
-
class << subject
|
58
|
-
def respond_to?(method_name)
|
59
|
-
true
|
60
|
-
end
|
61
|
-
|
62
|
-
def method_missing(method_name, *args, &block)
|
63
|
-
(class << self; self; end).class_eval do
|
64
|
-
define_method(method_name) {}
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
@double_injection = DoubleInjection.new(subject, method_name)
|
69
|
-
end
|
70
|
-
send("sets up object and method_name")
|
71
|
-
|
72
|
-
example "object has original method" do
|
73
|
-
double_injection.object_has_original_method?.should be_true
|
74
|
-
end
|
75
|
-
end
|
76
53
|
end
|
77
54
|
|
78
55
|
context "when method exists on object" do
|
@@ -82,7 +59,7 @@ module RR
|
|
82
59
|
@subject = Object.new
|
83
60
|
@method_name = :to_s
|
84
61
|
subject.methods.should include(method_name.to_s)
|
85
|
-
@double_injection = DoubleInjection.new(subject, method_name)
|
62
|
+
@double_injection = DoubleInjection.new(subject, method_name, (class << subject; self; end))
|
86
63
|
end
|
87
64
|
|
88
65
|
it "has a original_method" do
|
@@ -96,7 +73,7 @@ module RR
|
|
96
73
|
before do
|
97
74
|
@subject = Object.new
|
98
75
|
@method_name = '=='
|
99
|
-
@double_injection = DoubleInjection.new(subject, method_name)
|
76
|
+
@double_injection = DoubleInjection.new(subject, method_name, (class << subject; self; end))
|
100
77
|
end
|
101
78
|
end
|
102
79
|
end
|
data/spec/rr/space/space_spec.rb
CHANGED
@@ -74,8 +74,9 @@ module RR
|
|
74
74
|
end
|
75
75
|
|
76
76
|
it "overrides the method when passing a block" do
|
77
|
-
|
78
|
-
subject
|
77
|
+
original_method = subject.method(:foobar)
|
78
|
+
double_injection = space.double_injection(subject, method_name)
|
79
|
+
subject.method(:foobar).should_not == original_method
|
79
80
|
end
|
80
81
|
end
|
81
82
|
|
@@ -166,16 +167,20 @@ module RR
|
|
166
167
|
describe "#reset_double" do
|
167
168
|
before do
|
168
169
|
@method_name = :foobar
|
170
|
+
def subject.foobar
|
171
|
+
end
|
169
172
|
end
|
170
173
|
|
171
|
-
it "resets the double_injections" do
|
174
|
+
it "resets the double_injections and restores the original method" do
|
175
|
+
original_method = subject.method(method_name)
|
176
|
+
|
172
177
|
@double_injection = space.double_injection(subject, method_name)
|
173
178
|
space.double_injections[subject][method_name].should === double_injection
|
174
|
-
subject.
|
179
|
+
subject.method(method_name).should_not == original_method
|
175
180
|
|
176
181
|
space.reset_double(subject, method_name)
|
177
182
|
space.double_injections[subject][method_name].should be_nil
|
178
|
-
subject.
|
183
|
+
subject.method(method_name).should == original_method
|
179
184
|
end
|
180
185
|
|
181
186
|
context "when it has no double_injections" do
|
@@ -421,12 +426,13 @@ module RR
|
|
421
426
|
describe "#verify_double" do
|
422
427
|
before do
|
423
428
|
@method_name = :foobar
|
429
|
+
def subject.foobar
|
430
|
+
end
|
424
431
|
end
|
425
432
|
|
426
433
|
it "verifies and deletes the double_injection" do
|
427
434
|
@double_injection = space.double_injection(subject, method_name)
|
428
435
|
space.double_injections[subject][method_name].should === double_injection
|
429
|
-
subject.methods.should include("__rr__#{method_name}")
|
430
436
|
|
431
437
|
verify_call_count = 0
|
432
438
|
(class << double_injection; self; end).class_eval do
|
@@ -438,14 +444,16 @@ module RR
|
|
438
444
|
verify_call_count.should == 1
|
439
445
|
|
440
446
|
space.double_injections[subject][method_name].should be_nil
|
441
|
-
subject.methods.should_not include("__rr__#{method_name}")
|
442
447
|
end
|
443
448
|
|
444
449
|
context "when verifying the double_injection raises an error" do
|
445
|
-
it "deletes the double_injection" do
|
450
|
+
it "deletes the double_injection and restores the original method" do
|
451
|
+
original_method = subject.method(method_name)
|
452
|
+
|
446
453
|
@double_injection = space.double_injection(subject, method_name)
|
454
|
+
subject.method(method_name).should_not == original_method
|
455
|
+
|
447
456
|
space.double_injections[subject][method_name].should === double_injection
|
448
|
-
subject.methods.should include("__rr__#{method_name}")
|
449
457
|
|
450
458
|
verify_called = true
|
451
459
|
(class << double_injection; self; end).class_eval do
|
@@ -458,7 +466,7 @@ module RR
|
|
458
466
|
verify_called.should be_true
|
459
467
|
|
460
468
|
space.double_injections[subject][method_name].should be_nil
|
461
|
-
subject.
|
469
|
+
subject.method(method_name).should == original_method
|
462
470
|
end
|
463
471
|
end
|
464
472
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Takita
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-06-01 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|