rr 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
|