rr 0.1.15 → 0.2.1
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 +9 -0
- data/Rakefile +1 -1
- data/examples/example_helper.rb +1 -1
- data/examples/high_level_example.rb +1 -1
- data/examples/rr/double/double_bind_example.rb +0 -11
- data/examples/rr/double/double_reset_example.rb +0 -8
- data/examples/rr/extensions/{double_methods_argument_matcher_example.rb → instance_methods_argument_matcher_example.rb} +10 -10
- data/examples/rr/extensions/{double_methods_creator_example.rb → instance_methods_creator_example.rb} +45 -11
- data/examples/rr/extensions/{double_methods_example_helper.rb → instance_methods_example_helper.rb} +2 -2
- data/examples/rr/extensions/{double_methods_times_matcher_example.rb → instance_methods_times_matcher_example.rb} +2 -2
- data/examples/rr/{probe_creator_example.rb → mock_probe_creator_example.rb} +19 -16
- data/examples/rr/scenario_example.rb +21 -2
- data/examples/rr/space/space_create_example.rb +32 -4
- data/examples/rr/stub_probe_creator_example.rb +127 -0
- data/lib/rr.rb +3 -2
- data/lib/rr/adapters/rspec.rb +1 -1
- data/lib/rr/adapters/test_unit.rb +1 -1
- data/lib/rr/double.rb +5 -18
- data/lib/rr/extensions/{double_methods.rb → instance_methods.rb} +38 -6
- data/lib/rr/mock_probe_creator.rb +36 -0
- data/lib/rr/scenario.rb +2 -2
- data/lib/rr/space.rb +8 -3
- data/lib/rr/stub_probe_creator.rb +42 -0
- metadata +10 -8
- data/lib/rr/probe_creator.rb +0 -36
data/CHANGES
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
* 0.2.1
|
2
|
+
- Added mock_probe
|
3
|
+
- Added stub_probe
|
4
|
+
- Probe returns the return value of the passed in block, instead of ignoring its return value
|
5
|
+
- Scenario#after_call returns the return value of the passed in block
|
6
|
+
- Not using method aliasing to store original method
|
7
|
+
- Renamed DoubleMethods to InstanceMethods
|
8
|
+
- Added InstanceMethods#mock_probe
|
9
|
+
|
1
10
|
* 0.1.15
|
2
11
|
- Fixed [#12333] Rebinding original_methods causes blocks not to work
|
3
12
|
|
data/Rakefile
CHANGED
data/examples/example_helper.rb
CHANGED
@@ -2,7 +2,7 @@ dir = File.dirname(__FILE__)
|
|
2
2
|
require "#{dir}/environment_fixture_setup"
|
3
3
|
require "examples/rr/space/space_helper"
|
4
4
|
require "examples/rr/expectations/times_called_expectation/times_called_expectation_helper"
|
5
|
-
require "examples/rr/extensions/
|
5
|
+
require "examples/rr/extensions/instance_methods_example_helper"
|
6
6
|
|
7
7
|
require "rr/adapters/rspec"
|
8
8
|
Spec::Runner.configure do |config|
|
@@ -28,12 +28,6 @@ describe Double, "#bind with an existing method" do
|
|
28
28
|
@object.foobar
|
29
29
|
rr_foobar_called.should == true
|
30
30
|
end
|
31
|
-
|
32
|
-
it "stores original method in __rr__original_method_name" do
|
33
|
-
@double.bind
|
34
|
-
@object.respond_to?(:__rr__original_foobar).should == true
|
35
|
-
@object.method(:__rr__original_foobar).should == @original_method
|
36
|
-
end
|
37
31
|
end
|
38
32
|
|
39
33
|
describe Double, "#bind without an existing method" do
|
@@ -61,10 +55,5 @@ describe Double, "#bind without an existing method" do
|
|
61
55
|
@object.foobar
|
62
56
|
rr_foobar_called.should == true
|
63
57
|
end
|
64
|
-
|
65
|
-
it "stores original method in __rr__original_method_name" do
|
66
|
-
@double.bind
|
67
|
-
@object.respond_to?(:__rr__original_foobar).should == false
|
68
|
-
end
|
69
58
|
end
|
70
59
|
end
|
@@ -55,14 +55,6 @@ describe Double, "#reset when method exists" do
|
|
55
55
|
@object.methods.should include(@method_name.to_s)
|
56
56
|
@object.foobar.should == :original_foobar
|
57
57
|
end
|
58
|
-
|
59
|
-
it "cleans up by removing the __rr__original_method" do
|
60
|
-
@double.bind
|
61
|
-
@object.methods.should include("__rr__foobar")
|
62
|
-
|
63
|
-
@double.reset
|
64
|
-
@object.methods.should_not include("__rr__foobar")
|
65
|
-
end
|
66
58
|
end
|
67
59
|
|
68
60
|
describe Double, "#reset when method with block exists" do
|
@@ -2,8 +2,8 @@ require "examples/example_helper"
|
|
2
2
|
|
3
3
|
module RR
|
4
4
|
module Extensions
|
5
|
-
describe
|
6
|
-
it_should_behave_like "RR::Extensions::
|
5
|
+
describe InstanceMethods, "#anything" do
|
6
|
+
it_should_behave_like "RR::Extensions::InstanceMethods"
|
7
7
|
|
8
8
|
it "returns an Anything matcher" do
|
9
9
|
anything.should == WildcardMatchers::Anything.new
|
@@ -14,8 +14,8 @@ module Extensions
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
describe
|
18
|
-
it_should_behave_like "RR::Extensions::
|
17
|
+
describe InstanceMethods, "#is_a" do
|
18
|
+
it_should_behave_like "RR::Extensions::InstanceMethods"
|
19
19
|
|
20
20
|
it "returns an IsA matcher" do
|
21
21
|
is_a(Integer).should == WildcardMatchers::IsA.new(Integer)
|
@@ -26,8 +26,8 @@ module Extensions
|
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
29
|
-
describe
|
30
|
-
it_should_behave_like "RR::Extensions::
|
29
|
+
describe InstanceMethods, "#numeric" do
|
30
|
+
it_should_behave_like "RR::Extensions::InstanceMethods"
|
31
31
|
|
32
32
|
it "returns an Numeric matcher" do
|
33
33
|
numeric.should == WildcardMatchers::Numeric.new
|
@@ -38,8 +38,8 @@ module Extensions
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
-
describe
|
42
|
-
it_should_behave_like "RR::Extensions::
|
41
|
+
describe InstanceMethods, "#boolean" do
|
42
|
+
it_should_behave_like "RR::Extensions::InstanceMethods"
|
43
43
|
|
44
44
|
it "returns an Boolean matcher" do
|
45
45
|
boolean.should == WildcardMatchers::Boolean.new
|
@@ -50,8 +50,8 @@ module Extensions
|
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
-
describe
|
54
|
-
it_should_behave_like "RR::Extensions::
|
53
|
+
describe InstanceMethods, "#duck_type" do
|
54
|
+
it_should_behave_like "RR::Extensions::InstanceMethods"
|
55
55
|
|
56
56
|
it "returns a DuckType matcher" do
|
57
57
|
duck_type(:one, :two).should == WildcardMatchers::DuckType.new(:one, :two)
|
@@ -2,8 +2,8 @@ require "examples/example_helper"
|
|
2
2
|
|
3
3
|
module RR
|
4
4
|
module Extensions
|
5
|
-
describe
|
6
|
-
it_should_behave_like "RR::Extensions::
|
5
|
+
describe InstanceMethods, "#mock" do
|
6
|
+
it_should_behave_like "RR::Extensions::InstanceMethods"
|
7
7
|
|
8
8
|
before do
|
9
9
|
@subject = Object.new
|
@@ -33,8 +33,8 @@ module Extensions
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
describe
|
37
|
-
it_should_behave_like "RR::Extensions::
|
36
|
+
describe InstanceMethods, "#stub" do
|
37
|
+
it_should_behave_like "RR::Extensions::InstanceMethods"
|
38
38
|
|
39
39
|
before do
|
40
40
|
@subject = Object.new
|
@@ -62,22 +62,26 @@ module Extensions
|
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
|
-
describe
|
66
|
-
it_should_behave_like "RR::Extensions::
|
65
|
+
describe InstanceMethods, "#probe and #mock_probe" do
|
66
|
+
it_should_behave_like "RR::Extensions::InstanceMethods"
|
67
67
|
|
68
68
|
before do
|
69
69
|
@subject = Object.new
|
70
70
|
end
|
71
71
|
|
72
72
|
it "sets up the RR probe call chain" do
|
73
|
-
|
73
|
+
should_create_mock_probe_call_chain probe(@subject)
|
74
|
+
end
|
75
|
+
|
76
|
+
it "sets up the RR probe call chain" do
|
77
|
+
should_create_mock_probe_call_chain mock_probe(@subject)
|
74
78
|
end
|
75
79
|
|
76
80
|
it "sets up the RR probe call chain with rr_probe" do
|
77
|
-
|
81
|
+
should_create_mock_probe_call_chain rr_mock_probe(@subject)
|
78
82
|
end
|
79
83
|
|
80
|
-
def
|
84
|
+
def should_create_mock_probe_call_chain(creator)
|
81
85
|
class << @subject
|
82
86
|
def foobar(*args)
|
83
87
|
:original_value
|
@@ -93,8 +97,38 @@ module Extensions
|
|
93
97
|
end
|
94
98
|
end
|
95
99
|
|
96
|
-
describe
|
97
|
-
it_should_behave_like "RR::Extensions::
|
100
|
+
describe InstanceMethods, "#stub_probe" do
|
101
|
+
it_should_behave_like "RR::Extensions::InstanceMethods"
|
102
|
+
|
103
|
+
before do
|
104
|
+
@subject = Object.new
|
105
|
+
end
|
106
|
+
|
107
|
+
it "sets up the RR probe call chain" do
|
108
|
+
should_create_stub_probe_call_chain stub_probe(@subject)
|
109
|
+
end
|
110
|
+
|
111
|
+
it "sets up the RR probe call chain" do
|
112
|
+
should_create_stub_probe_call_chain rr_stub_probe(@subject)
|
113
|
+
end
|
114
|
+
|
115
|
+
def should_create_stub_probe_call_chain(creator)
|
116
|
+
class << @subject
|
117
|
+
def foobar(*args)
|
118
|
+
:original_value
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
scenario = creator.foobar
|
123
|
+
scenario.times_matcher.should == TimesCalledMatchers::AnyTimesMatcher.new
|
124
|
+
scenario.argument_expectation.class.should == RR::Expectations::AnyArgumentExpectation
|
125
|
+
|
126
|
+
@subject.foobar(:something).should == :original_value
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe InstanceMethods, "#do_not_allow" do
|
131
|
+
it_should_behave_like "RR::Extensions::InstanceMethods"
|
98
132
|
|
99
133
|
before do
|
100
134
|
@subject = Object.new
|
data/examples/rr/extensions/{double_methods_example_helper.rb → instance_methods_example_helper.rb}
RENAMED
@@ -2,9 +2,9 @@ require "examples/example_helper"
|
|
2
2
|
|
3
3
|
module RR
|
4
4
|
module Extensions
|
5
|
-
describe
|
5
|
+
describe InstanceMethods, :shared => true do
|
6
6
|
before do
|
7
|
-
extend RR::Extensions::
|
7
|
+
extend RR::Extensions::InstanceMethods
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
@@ -2,8 +2,8 @@ require "examples/example_helper"
|
|
2
2
|
|
3
3
|
module RR
|
4
4
|
module Extensions
|
5
|
-
describe
|
6
|
-
it_should_behave_like "RR::Extensions::
|
5
|
+
describe InstanceMethods, "#any_times" do
|
6
|
+
it_should_behave_like "RR::Extensions::InstanceMethods"
|
7
7
|
|
8
8
|
it "returns an AnyTimesMatcher" do
|
9
9
|
any_times.should == TimesCalledMatchers::AnyTimesMatcher.new
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require "examples/example_helper"
|
2
2
|
|
3
3
|
module RR
|
4
|
-
describe
|
4
|
+
describe MockProbeCreator, :shared => true do
|
5
5
|
before(:each) do
|
6
6
|
@space = Space.new
|
7
7
|
@subject = Object.new
|
@@ -15,15 +15,15 @@ describe ProbeCreator, :shared => true do
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
describe
|
19
|
-
it_should_behave_like "RR::
|
18
|
+
describe MockProbeCreator, ".new without block" do
|
19
|
+
it_should_behave_like "RR::MockProbeCreator"
|
20
20
|
|
21
21
|
before do
|
22
|
-
@creator =
|
22
|
+
@creator = MockProbeCreator.new(@space, @subject)
|
23
23
|
end
|
24
24
|
|
25
25
|
it "clears out all methods from creator" do
|
26
|
-
creator_subclass = Class.new(
|
26
|
+
creator_subclass = Class.new(MockProbeCreator) do
|
27
27
|
def i_should_be_a_scenario
|
28
28
|
end
|
29
29
|
end
|
@@ -34,14 +34,14 @@ describe ProbeCreator, ".new without block" do
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
describe
|
38
|
-
it_should_behave_like "RR::
|
37
|
+
describe MockProbeCreator, ".new with block" do
|
38
|
+
it_should_behave_like "RR::MockProbeCreator"
|
39
39
|
|
40
40
|
before do
|
41
41
|
def @subject.foobar(*args)
|
42
42
|
:original_foobar
|
43
43
|
end
|
44
|
-
@creator =
|
44
|
+
@creator = MockProbeCreator.new(@space, @subject) do |c|
|
45
45
|
c.foobar(1, 2)
|
46
46
|
c.foobar(1)
|
47
47
|
c.foobar.with_any_args
|
@@ -56,7 +56,7 @@ describe ProbeCreator, ".new with block" do
|
|
56
56
|
end
|
57
57
|
|
58
58
|
it "clears out all methods from creator" do
|
59
|
-
creator_subclass = Class.new(
|
59
|
+
creator_subclass = Class.new(MockProbeCreator) do
|
60
60
|
def i_should_be_a_scenario
|
61
61
|
end
|
62
62
|
end
|
@@ -68,14 +68,14 @@ describe ProbeCreator, ".new with block" do
|
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
|
-
describe
|
72
|
-
it_should_behave_like "RR::
|
71
|
+
describe MockProbeCreator, ".new where method takes a block" do
|
72
|
+
it_should_behave_like "RR::MockProbeCreator"
|
73
73
|
|
74
74
|
before do
|
75
75
|
def @subject.foobar(*args, &block)
|
76
76
|
yield(*args)
|
77
77
|
end
|
78
|
-
@creator =
|
78
|
+
@creator = MockProbeCreator.new(@space, @subject)
|
79
79
|
end
|
80
80
|
|
81
81
|
it "calls the block" do
|
@@ -85,12 +85,12 @@ describe ProbeCreator, ".new where method takes a block" do
|
|
85
85
|
end
|
86
86
|
|
87
87
|
|
88
|
-
describe
|
89
|
-
it_should_behave_like "RR::
|
88
|
+
describe MockProbeCreator, "#method_missing" do
|
89
|
+
it_should_behave_like "RR::MockProbeCreator"
|
90
90
|
|
91
91
|
before do
|
92
92
|
@subject = Object.new
|
93
|
-
@creator =
|
93
|
+
@creator = MockProbeCreator.new(@space, @subject)
|
94
94
|
end
|
95
95
|
|
96
96
|
it "sets expectations on the subject while calling the original method" do
|
@@ -106,7 +106,10 @@ describe ProbeCreator, "#method_missing" do
|
|
106
106
|
(class << @subject; self; end).class_eval do
|
107
107
|
define_method(:foobar) {real_value}
|
108
108
|
end
|
109
|
-
@creator.foobar(1, 2)
|
109
|
+
@creator.foobar(1, 2) do |value|
|
110
|
+
mock(value).a_method {99}
|
111
|
+
value
|
112
|
+
end
|
110
113
|
|
111
114
|
return_value = @subject.foobar(1, 2)
|
112
115
|
return_value.should === return_value
|
@@ -262,10 +262,11 @@ describe Scenario, "#after_call" do
|
|
262
262
|
@scenario.after_call {}.should === @scenario
|
263
263
|
end
|
264
264
|
|
265
|
-
it "
|
265
|
+
it "sends return value of Scenario implementation to after_call" do
|
266
266
|
return_value = {}
|
267
267
|
@scenario.returns(return_value).after_call do |value|
|
268
268
|
value[:foo] = :bar
|
269
|
+
value
|
269
270
|
end
|
270
271
|
|
271
272
|
actual_value = @scenario.call
|
@@ -273,10 +274,21 @@ describe Scenario, "#after_call" do
|
|
273
274
|
actual_value.should == {:foo => :bar}
|
274
275
|
end
|
275
276
|
|
277
|
+
it "receives the return value in the after_call callback" do
|
278
|
+
return_value = :returns_value
|
279
|
+
@scenario.returns(return_value).after_call do |value|
|
280
|
+
:after_call_value
|
281
|
+
end
|
282
|
+
|
283
|
+
actual_value = @scenario.call
|
284
|
+
actual_value.should == :after_call_value
|
285
|
+
end
|
286
|
+
|
276
287
|
it "allows after_call to mock the return value" do
|
277
288
|
return_value = Object.new
|
278
289
|
@scenario.with_any_args.returns(return_value).after_call do |value|
|
279
290
|
mock(value).inner_method(1) {:baz}
|
291
|
+
value
|
280
292
|
end
|
281
293
|
|
282
294
|
@object.foobar.inner_method(1).should == :baz
|
@@ -343,11 +355,18 @@ end
|
|
343
355
|
describe Scenario, "#call implemented by a proc" do
|
344
356
|
it_should_behave_like "RR::Scenario"
|
345
357
|
|
346
|
-
it "calls the return proc when
|
358
|
+
it "calls the return proc when implemented by a proc" do
|
347
359
|
@scenario.returns {|arg| "returning #{arg}"}
|
348
360
|
@scenario.call(:foobar).should == "returning foobar"
|
349
361
|
end
|
350
362
|
|
363
|
+
it "calls and returns the after_call when after_call is set" do
|
364
|
+
@scenario.returns {|arg| "returning #{arg}"}.after_call do |value|
|
365
|
+
"#{value} after call"
|
366
|
+
end
|
367
|
+
@scenario.call(:foobar).should == "returning foobar after call"
|
368
|
+
end
|
369
|
+
|
351
370
|
it "returns nil when to returns is not set" do
|
352
371
|
@scenario.call.should be_nil
|
353
372
|
end
|
@@ -53,7 +53,7 @@ describe Space, "#create_stub_creator" do
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
-
describe Space, "#
|
56
|
+
describe Space, "#create_mock_probe_creator" do
|
57
57
|
it_should_behave_like "RR::Space"
|
58
58
|
|
59
59
|
before do
|
@@ -65,15 +65,15 @@ describe Space, "#create_probe_creator" do
|
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
68
|
-
it "creates a
|
69
|
-
creator = @space.
|
68
|
+
it "creates a MockProbeCreator" do
|
69
|
+
creator = @space.create_mock_probe_creator(@object)
|
70
70
|
creator.foobar(1)
|
71
71
|
@object.foobar(1).should == :original_foobar
|
72
72
|
proc {@object.foobar(1)}.should raise_error(Errors::TimesCalledError)
|
73
73
|
end
|
74
74
|
|
75
75
|
it "uses block definition when passed a block" do
|
76
|
-
creator = @space.
|
76
|
+
creator = @space.create_mock_probe_creator(@object) do |c|
|
77
77
|
c.foobar(1)
|
78
78
|
end
|
79
79
|
@object.foobar(1).should == :original_foobar
|
@@ -81,6 +81,34 @@ describe Space, "#create_probe_creator" do
|
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
84
|
+
describe Space, "#create_stub_probe_creator" do
|
85
|
+
it_should_behave_like "RR::Space"
|
86
|
+
|
87
|
+
before do
|
88
|
+
@space = Space.new
|
89
|
+
@object = Object.new
|
90
|
+
@method_name = :foobar
|
91
|
+
def @object.foobar(*args)
|
92
|
+
:original_foobar
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
it "creates a StubProbeCreator" do
|
97
|
+
creator = @space.create_stub_probe_creator(@object)
|
98
|
+
creator.foobar
|
99
|
+
@object.foobar(1).should == :original_foobar
|
100
|
+
@object.foobar(1).should == :original_foobar
|
101
|
+
end
|
102
|
+
|
103
|
+
it "uses block definition when passed a block" do
|
104
|
+
creator = @space.create_stub_probe_creator(@object) do |c|
|
105
|
+
c.foobar(1)
|
106
|
+
end
|
107
|
+
@object.foobar(1).should == :original_foobar
|
108
|
+
@object.foobar(1).should == :original_foobar
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
84
112
|
describe Space, "#create_do_not_allow_creator" do
|
85
113
|
it_should_behave_like "RR::Space"
|
86
114
|
|
@@ -0,0 +1,127 @@
|
|
1
|
+
require "examples/example_helper"
|
2
|
+
|
3
|
+
module RR
|
4
|
+
describe StubProbeCreator, :shared => true do
|
5
|
+
before(:each) do
|
6
|
+
@space = Space.new
|
7
|
+
@subject = Object.new
|
8
|
+
end
|
9
|
+
|
10
|
+
it "initializes creator with passed in object" do
|
11
|
+
class << @creator
|
12
|
+
attr_reader :subject
|
13
|
+
end
|
14
|
+
@creator.subject.should === @subject
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe StubProbeCreator, ".new without block" do
|
19
|
+
it_should_behave_like "RR::StubProbeCreator"
|
20
|
+
|
21
|
+
before do
|
22
|
+
@creator = StubProbeCreator.new(@space, @subject)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "clears out all methods from creator" do
|
26
|
+
creator_subclass = Class.new(StubProbeCreator) do
|
27
|
+
def i_should_be_a_scenario
|
28
|
+
end
|
29
|
+
end
|
30
|
+
creator_subclass.instance_methods.should include('i_should_be_a_scenario')
|
31
|
+
|
32
|
+
creator = creator_subclass.new(@space, @subject)
|
33
|
+
creator.i_should_be_a_scenario.should be_instance_of(Scenario)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe StubProbeCreator, ".new with block" do
|
38
|
+
it_should_behave_like "RR::StubProbeCreator"
|
39
|
+
|
40
|
+
before do
|
41
|
+
def @subject.foobar(*args)
|
42
|
+
:original_foobar
|
43
|
+
end
|
44
|
+
@creator = StubProbeCreator.new(@space, @subject) do |c|
|
45
|
+
c.foobar
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
it "creates doubles" do
|
50
|
+
@subject.foobar(1, 2).should == :original_foobar
|
51
|
+
@subject.foobar(1, 2).should == :original_foobar
|
52
|
+
@subject.foobar(1).should == :original_foobar
|
53
|
+
@subject.foobar(1).should == :original_foobar
|
54
|
+
@subject.foobar(:something).should == :original_foobar
|
55
|
+
@subject.foobar(:something).should == :original_foobar
|
56
|
+
end
|
57
|
+
|
58
|
+
it "clears out all methods from creator" do
|
59
|
+
creator_subclass = Class.new(StubProbeCreator) do
|
60
|
+
def i_should_be_a_scenario
|
61
|
+
end
|
62
|
+
end
|
63
|
+
creator_subclass.instance_methods.should include('i_should_be_a_scenario')
|
64
|
+
|
65
|
+
creator_subclass.new(@space, @subject) do |m|
|
66
|
+
m.i_should_be_a_scenario.should be_instance_of(Scenario)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe StubProbeCreator, ".new where method takes a block" do
|
72
|
+
it_should_behave_like "RR::StubProbeCreator"
|
73
|
+
|
74
|
+
before do
|
75
|
+
def @subject.foobar(*args, &block)
|
76
|
+
yield(*args)
|
77
|
+
end
|
78
|
+
@creator = StubProbeCreator.new(@space, @subject)
|
79
|
+
end
|
80
|
+
|
81
|
+
it "calls the block" do
|
82
|
+
@creator.foobar(1, 2)
|
83
|
+
@subject.foobar(1, 2) {|arg1, arg2| [arg2, arg1]}.should == [2, 1]
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe StubProbeCreator, "#method_missing" do
|
88
|
+
it_should_behave_like "RR::StubProbeCreator"
|
89
|
+
|
90
|
+
before do
|
91
|
+
@subject = Object.new
|
92
|
+
@creator = StubProbeCreator.new(@space, @subject)
|
93
|
+
end
|
94
|
+
|
95
|
+
it "sets up a scenario with passed in arguments" do
|
96
|
+
def @subject.foobar(*args); :baz; end
|
97
|
+
@creator.foobar(1, 2)
|
98
|
+
proc do
|
99
|
+
@subject.foobar
|
100
|
+
end.should raise_error(Errors::ScenarioNotFoundError)
|
101
|
+
end
|
102
|
+
|
103
|
+
it "sets expectations on the subject while calling the original method" do
|
104
|
+
def @subject.foobar(*args); :baz; end
|
105
|
+
@creator.foobar(1, 2) {:new_value}
|
106
|
+
10.times do
|
107
|
+
@subject.foobar(1, 2).should == :new_value
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
it "sets after_call on the scenario when passed a block" do
|
112
|
+
real_value = Object.new
|
113
|
+
(class << @subject; self; end).class_eval do
|
114
|
+
define_method(:foobar) {real_value}
|
115
|
+
end
|
116
|
+
@creator.foobar(1, 2) do |value|
|
117
|
+
mock(value).a_method {99}
|
118
|
+
value
|
119
|
+
end
|
120
|
+
|
121
|
+
return_value = @subject.foobar(1, 2)
|
122
|
+
return_value.should === return_value
|
123
|
+
return_value.a_method.should == 99
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
data/lib/rr.rb
CHANGED
@@ -4,7 +4,8 @@ require "rr/double"
|
|
4
4
|
require "rr/creator"
|
5
5
|
require "rr/mock_creator"
|
6
6
|
require "rr/stub_creator"
|
7
|
-
require "rr/
|
7
|
+
require "rr/mock_probe_creator"
|
8
|
+
require "rr/stub_probe_creator"
|
8
9
|
require "rr/do_not_allow_creator"
|
9
10
|
|
10
11
|
require "rr/scenario"
|
@@ -38,4 +39,4 @@ require "rr/times_called_matchers/proc_matcher"
|
|
38
39
|
require "rr/times_called_matchers/at_least_matcher"
|
39
40
|
require "rr/times_called_matchers/at_most_matcher"
|
40
41
|
|
41
|
-
require "rr/extensions/
|
42
|
+
require "rr/extensions/instance_methods"
|
data/lib/rr/adapters/rspec.rb
CHANGED
data/lib/rr/double.rb
CHANGED
@@ -4,15 +4,13 @@ module RR
|
|
4
4
|
# has Argument Expectations and Times called Expectations.
|
5
5
|
class Double
|
6
6
|
MethodArguments = Struct.new(:arguments, :block)
|
7
|
-
attr_reader :space, :object, :method_name, :scenarios
|
7
|
+
attr_reader :space, :object, :method_name, :original_method, :scenarios
|
8
8
|
|
9
9
|
def initialize(space, object, method_name)
|
10
10
|
@space = space
|
11
11
|
@object = object
|
12
12
|
@method_name = method_name.to_sym
|
13
|
-
if @object.
|
14
|
-
meta.send(:alias_method, original_method_name, method_name)
|
15
|
-
end
|
13
|
+
@original_method = object.method(method_name) if @object.methods.include?(method_name.to_s)
|
16
14
|
@scenarios = []
|
17
15
|
end
|
18
16
|
|
@@ -49,21 +47,13 @@ module RR
|
|
49
47
|
# if one exists.
|
50
48
|
def reset
|
51
49
|
meta.send(:remove_method, placeholder_name)
|
52
|
-
if original_method
|
53
|
-
meta.send(:
|
54
|
-
meta.send(:remove_method, original_method_name)
|
50
|
+
if @original_method
|
51
|
+
meta.send(:define_method, @method_name, @original_method)
|
55
52
|
else
|
56
53
|
meta.send(:remove_method, @method_name)
|
57
54
|
end
|
58
55
|
end
|
59
56
|
|
60
|
-
# The original method of the object. It returns nil if the object
|
61
|
-
# does not have an original method.
|
62
|
-
def original_method
|
63
|
-
return nil unless @object.respond_to?(original_method_name)
|
64
|
-
return @object.method(original_method_name)
|
65
|
-
end
|
66
|
-
|
67
57
|
protected
|
68
58
|
def define_implementation_placeholder
|
69
59
|
me = self
|
@@ -79,6 +69,7 @@ module RR
|
|
79
69
|
scenario_not_found_error(*args)
|
80
70
|
end
|
81
71
|
|
72
|
+
protected
|
82
73
|
def find_scenario_to_attempt(args)
|
83
74
|
matches = ScenarioMatches.new(@scenarios).find_all_matches!(args)
|
84
75
|
|
@@ -115,10 +106,6 @@ module RR
|
|
115
106
|
def placeholder_name
|
116
107
|
"__rr__#{@method_name}"
|
117
108
|
end
|
118
|
-
|
119
|
-
def original_method_name
|
120
|
-
"__rr__original_#{@method_name}"
|
121
|
-
end
|
122
109
|
|
123
110
|
def meta
|
124
111
|
(class << @object; self; end)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module RR
|
2
2
|
module Extensions
|
3
|
-
module
|
3
|
+
module InstanceMethods
|
4
4
|
# Sets up a MockCreator that generates a Double Scenario that
|
5
5
|
# acts like a mock.
|
6
6
|
# mock(object).method_name(arg1, arg2) {return_value}
|
@@ -15,13 +15,45 @@ module Extensions
|
|
15
15
|
RR::Space.instance.create_stub_creator(subject, &definition)
|
16
16
|
end
|
17
17
|
|
18
|
-
# Sets up a
|
19
|
-
# acts like
|
20
|
-
#
|
21
|
-
|
22
|
-
|
18
|
+
# Sets up a MockProbeCreator that generates a Double Scenario that
|
19
|
+
# acts like mock verifications while calling the actual method.
|
20
|
+
#
|
21
|
+
# mock_probe(controller.template).render(:partial => "my/socks")
|
22
|
+
#
|
23
|
+
# Passing a block allows you to intercept the return value.
|
24
|
+
# The return value can be modified, validated, and/or overridden by
|
25
|
+
# passing in a block. The return value of the block will replace
|
26
|
+
# the actual return value.
|
27
|
+
#
|
28
|
+
# mock_probe(controller.template).render(:partial => "my/socks") do |html|
|
29
|
+
# html.should include("My socks are wet")
|
30
|
+
# "My new return value"
|
31
|
+
# end
|
32
|
+
def mock_probe(subject, &definition)
|
33
|
+
RR::Space.instance.create_mock_probe_creator(subject, &definition)
|
23
34
|
end
|
24
35
|
|
36
|
+
# Sets up a StubProbeCreator that generates a Double Scenario that
|
37
|
+
# acts like mock verifications while calling the actual method.
|
38
|
+
#
|
39
|
+
# mock_probe(User).new {|user| my_user}
|
40
|
+
#
|
41
|
+
# Passing a block allows you to intercept the return value.
|
42
|
+
# The return value can be modified, validated, and/or overridden by
|
43
|
+
# passing in a block. The return value of the block will replace
|
44
|
+
# the actual return value.
|
45
|
+
#
|
46
|
+
# mock_probe(controller.template).render(:partial => "my/socks") do |html|
|
47
|
+
# html.should include("My socks are wet")
|
48
|
+
# "My new return value"
|
49
|
+
# end
|
50
|
+
def stub_probe(subject, &definition)
|
51
|
+
RR::Space.instance.create_stub_probe_creator(subject, &definition)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Same as mock_probe
|
55
|
+
alias_method :probe, :mock_probe
|
56
|
+
|
25
57
|
# Sets up a DoNotAllowCreator that generates a Double Scenario that
|
26
58
|
# expects never to be called.
|
27
59
|
# do_not_allow(object).method_name
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module RR
|
2
|
+
# RR::MockProbeCreator uses RR::MockProbeCreator#method_missing to create
|
3
|
+
# a Scenario that acts like a mock with probing capabilities.
|
4
|
+
#
|
5
|
+
# Passing a block allows you to intercept the return value.
|
6
|
+
# The return value can be modified, validated, and/or overridden by
|
7
|
+
# passing in a block. The return value of the block will replace
|
8
|
+
# the actual return value.
|
9
|
+
#
|
10
|
+
# probe(subject).method_name(arg1, arg2) do |return_value|
|
11
|
+
# return_value.method_name.should == :return_value
|
12
|
+
# my_return_value
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# probe(User) do |m|
|
16
|
+
# m.find('4') do |user|
|
17
|
+
# mock(user).valid? {false}
|
18
|
+
# user
|
19
|
+
# end
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# user = User.find('4')
|
23
|
+
# user.valid? # false
|
24
|
+
class MockProbeCreator < Creator
|
25
|
+
module InstanceMethods
|
26
|
+
protected
|
27
|
+
def method_missing(method_name, *args, &after_call)
|
28
|
+
double = @space.create_double(@subject, method_name)
|
29
|
+
scenario = @space.create_scenario(double)
|
30
|
+
scenario.with(*args).once.implemented_by(double.original_method)
|
31
|
+
scenario.after_call(&after_call) if after_call
|
32
|
+
scenario
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/rr/scenario.rb
CHANGED
@@ -243,8 +243,8 @@ module RR
|
|
243
243
|
# exceeds the expected TimesCalledExpectation.
|
244
244
|
def call(*args, &block)
|
245
245
|
return_value = call_implementation(*args, &block)
|
246
|
-
|
247
|
-
return_value
|
246
|
+
return return_value unless @after_call
|
247
|
+
@after_call.call(return_value)
|
248
248
|
end
|
249
249
|
|
250
250
|
def call_implementation(*args, &block)
|
data/lib/rr/space.rb
CHANGED
@@ -33,9 +33,14 @@ module RR
|
|
33
33
|
StubCreator.new(self, subject, &definition)
|
34
34
|
end
|
35
35
|
|
36
|
-
# Creates a
|
37
|
-
def
|
38
|
-
|
36
|
+
# Creates a MockProbeCreator.
|
37
|
+
def create_mock_probe_creator(subject, &definition)
|
38
|
+
MockProbeCreator.new(self, subject, &definition)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Creates a StubProbeCreator.
|
42
|
+
def create_stub_probe_creator(subject, &definition)
|
43
|
+
StubProbeCreator.new(self, subject, &definition)
|
39
44
|
end
|
40
45
|
|
41
46
|
# Creates a DoNotAllowCreator.
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module RR
|
2
|
+
# RR::StubProbeCreator uses RR::StubProbeCreator#method_missing to create
|
3
|
+
# a Scenario that acts like a stub with probing capabilities.
|
4
|
+
#
|
5
|
+
# Passing a block allows you to intercept the return value.
|
6
|
+
# The return value can be modified, validated, and/or overridden by
|
7
|
+
# passing in a block. The return value of the block will replace
|
8
|
+
# the actual return value.
|
9
|
+
#
|
10
|
+
# probe_stub(subject).method_name(arg1, arg2) do |return_value|
|
11
|
+
# return_value.method_name.should == :return_value
|
12
|
+
# my_return_value
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# probe_stub(User) do |m|
|
16
|
+
# m.find do |user|
|
17
|
+
# mock(user).valid? {false}
|
18
|
+
# user
|
19
|
+
# end
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# user = User.find('4')
|
23
|
+
# user.valid? # false
|
24
|
+
class StubProbeCreator < Creator
|
25
|
+
module InstanceMethods
|
26
|
+
protected
|
27
|
+
def method_missing(method_name, *args, &after_call)
|
28
|
+
double = @space.create_double(@subject, method_name)
|
29
|
+
scenario = @space.create_scenario(double)
|
30
|
+
scenario.implemented_by(double.original_method)
|
31
|
+
scenario.any_number_of_times
|
32
|
+
if args.empty?
|
33
|
+
scenario.with_any_args
|
34
|
+
else
|
35
|
+
scenario.with(*args)
|
36
|
+
end
|
37
|
+
scenario.after_call(&after_call) if after_call
|
38
|
+
scenario
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
metadata
CHANGED
@@ -3,7 +3,7 @@ rubygems_version: 0.9.3
|
|
3
3
|
specification_version: 1
|
4
4
|
name: rr
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1
|
6
|
+
version: 0.2.1
|
7
7
|
date: 2007-07-17 00:00:00 -07:00
|
8
8
|
summary: RR (Double Ruby) is a double framework that features a rich selection of double techniques and a terse syntax. http://xunitpatterns.com/Test%20Double.html
|
9
9
|
require_paths:
|
@@ -33,15 +33,16 @@ files:
|
|
33
33
|
- CHANGES
|
34
34
|
- README
|
35
35
|
- lib/rr.rb
|
36
|
+
- lib/rr/mock_probe_creator.rb
|
36
37
|
- lib/rr/scenario.rb
|
37
38
|
- lib/rr/creator.rb
|
39
|
+
- lib/rr/stub_probe_creator.rb
|
38
40
|
- lib/rr/scenario_matches.rb
|
39
41
|
- lib/rr/stub_creator.rb
|
40
42
|
- lib/rr/space.rb
|
41
43
|
- lib/rr/double.rb
|
42
44
|
- lib/rr/do_not_allow_creator.rb
|
43
45
|
- lib/rr/mock_creator.rb
|
44
|
-
- lib/rr/probe_creator.rb
|
45
46
|
- lib/rr/times_called_matchers/any_times_matcher.rb
|
46
47
|
- lib/rr/times_called_matchers/at_most_matcher.rb
|
47
48
|
- lib/rr/times_called_matchers/times_called_matcher.rb
|
@@ -68,18 +69,19 @@ files:
|
|
68
69
|
- lib/rr/wildcard_matchers/numeric.rb
|
69
70
|
- lib/rr/wildcard_matchers/is_a.rb
|
70
71
|
- lib/rr/wildcard_matchers/anything.rb
|
71
|
-
- lib/rr/extensions/
|
72
|
+
- lib/rr/extensions/instance_methods.rb
|
72
73
|
- examples/environment_fixture_setup.rb
|
73
74
|
- examples/rspec_example_suite.rb
|
74
75
|
- examples/example_suite.rb
|
75
76
|
- examples/example_helper.rb
|
76
77
|
- examples/test_unit_example_suite.rb
|
77
78
|
- examples/high_level_example.rb
|
78
|
-
- examples/rr/
|
79
|
+
- examples/rr/stub_probe_creator_example.rb
|
79
80
|
- examples/rr/mock_creator_example.rb
|
80
81
|
- examples/rr/stub_creator_example.rb
|
81
82
|
- examples/rr/scenario_example.rb
|
82
83
|
- examples/rr/do_not_allow_creator_example.rb
|
84
|
+
- examples/rr/mock_probe_creator_example.rb
|
83
85
|
- examples/rr/rspec/rspec_backtrace_tweaking_example.rb
|
84
86
|
- examples/rr/rspec/rspec_adapter_example.rb
|
85
87
|
- examples/rr/rspec/rspec_usage_example.rb
|
@@ -123,10 +125,10 @@ files:
|
|
123
125
|
- examples/rr/test_unit/test_unit_backtrace_test.rb
|
124
126
|
- examples/rr/test_unit/test_helper.rb
|
125
127
|
- examples/rr/test_unit/test_unit_integration_test.rb
|
126
|
-
- examples/rr/extensions/
|
127
|
-
- examples/rr/extensions/
|
128
|
-
- examples/rr/extensions/
|
129
|
-
- examples/rr/extensions/
|
128
|
+
- examples/rr/extensions/instance_methods_argument_matcher_example.rb
|
129
|
+
- examples/rr/extensions/instance_methods_times_matcher_example.rb
|
130
|
+
- examples/rr/extensions/instance_methods_creator_example.rb
|
131
|
+
- examples/rr/extensions/instance_methods_example_helper.rb
|
130
132
|
test_files: []
|
131
133
|
|
132
134
|
rdoc_options:
|
data/lib/rr/probe_creator.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
module RR
|
2
|
-
# RR::ProbeCreator uses RR::ProbeCreator#method_missing to create
|
3
|
-
# a Scenario that acts like a probe.
|
4
|
-
#
|
5
|
-
# The following example probes method_name with arg1 and arg2
|
6
|
-
# returning the actual value of the method. The block is an after callback
|
7
|
-
# that intercepts the return value. Mocks or other modifications can
|
8
|
-
# be done to the return value.
|
9
|
-
#
|
10
|
-
# probe(subject).method_name(arg1, arg2) { |return_value| }
|
11
|
-
#
|
12
|
-
# The ProbeCreator also supports a block sytnax. The block accepts
|
13
|
-
# a after_call callback, instead of a return value as with MockCreator
|
14
|
-
# and StubCreator.
|
15
|
-
#
|
16
|
-
# probe(User) do |m|
|
17
|
-
# m.find('4') do |user|
|
18
|
-
# mock(user).valid? {false}
|
19
|
-
# end
|
20
|
-
# end
|
21
|
-
#
|
22
|
-
# user = User.find('4')
|
23
|
-
# user.valid? # false
|
24
|
-
class ProbeCreator < Creator
|
25
|
-
module InstanceMethods
|
26
|
-
protected
|
27
|
-
def method_missing(method_name, *args, &after_call)
|
28
|
-
double = @space.create_double(@subject, method_name)
|
29
|
-
scenario = @space.create_scenario(double)
|
30
|
-
scenario.with(*args).once.implemented_by(double.original_method)
|
31
|
-
scenario.after_call(&after_call) if after_call
|
32
|
-
scenario
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|