rr 1.0.4 → 1.0.5.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. checksums.yaml +15 -0
  2. data/CHANGES.md +376 -0
  3. data/Gemfile +7 -10
  4. data/README.md +822 -0
  5. data/Rakefile +24 -78
  6. data/VERSION +1 -0
  7. data/lib/rr.rb +3 -0
  8. data/lib/rr/adapters/minitest.rb +6 -0
  9. data/lib/rr/adapters/rr_methods.rb +6 -10
  10. data/lib/rr/adapters/rspec.rb +3 -0
  11. data/lib/rr/adapters/rspec2.rb +30 -0
  12. data/lib/rr/adapters/test_unit.rb +2 -0
  13. data/lib/rr/double.rb +3 -2
  14. data/lib/rr/double_definitions/child_double_definition_create.rb +3 -2
  15. data/lib/rr/double_definitions/double_definition.rb +15 -13
  16. data/lib/rr/double_definitions/double_definition_create.rb +9 -5
  17. data/lib/rr/double_definitions/double_injections/any_instance_of.rb +3 -2
  18. data/lib/rr/double_definitions/strategies/strategy.rb +5 -4
  19. data/lib/rr/double_definitions/strategies/strategy_methods.rb +6 -8
  20. data/lib/rr/double_definitions/strategies/verification/mock.rb +3 -3
  21. data/lib/rr/double_matches.rb +2 -1
  22. data/lib/rr/expectations/argument_equality_expectation.rb +2 -2
  23. data/lib/rr/expectations/times_called_expectation.rb +2 -2
  24. data/lib/rr/injections/double_injection.rb +12 -11
  25. data/lib/rr/injections/injection.rb +2 -2
  26. data/lib/rr/injections/method_missing_injection.rb +21 -7
  27. data/lib/rr/injections/singleton_method_added_injection.rb +3 -1
  28. data/lib/rr/method_dispatches/base_method_dispatch.rb +1 -1
  29. data/lib/rr/method_dispatches/method_dispatch.rb +2 -1
  30. data/lib/rr/method_dispatches/method_missing_dispatch.rb +2 -1
  31. data/lib/rr/proc_from_block.rb +8 -4
  32. data/lib/rr/space.rb +3 -2
  33. data/lib/rr/times_called_matchers/times_called_matcher.rb +2 -2
  34. data/lib/rr/version.rb +5 -0
  35. data/lib/rr/wildcard_matchers/boolean.rb +2 -2
  36. data/spec/runner.rb +41 -0
  37. metadata +45 -133
  38. data/.gitignore +0 -10
  39. data/.runrc +0 -3
  40. data/.rvmrc +0 -2
  41. data/CHANGES +0 -266
  42. data/Gemfile.lock +0 -31
  43. data/README.rdoc +0 -392
  44. data/benchmarks/rr_benchmark.rb +0 -32
  45. data/benchmarks/rspec_benchmark.rb +0 -14
  46. data/doc/0.6.0.release.markdown +0 -81
  47. data/doc/todo.txt +0 -0
  48. data/introducting_rr.txt +0 -206
  49. data/rr.gemspec +0 -37
  50. data/spec/api/any_instance_of/all_instances_of_spec.rb +0 -12
  51. data/spec/api/any_instance_of/any_instance_of_spec.rb +0 -47
  52. data/spec/api/any_instance_of/instance_of_spec.rb +0 -12
  53. data/spec/api/dont_allow/dont_allow_after_stub_spec.rb +0 -14
  54. data/spec/api/mock/mock_spec.rb +0 -193
  55. data/spec/api/proxy/proxy_spec.rb +0 -86
  56. data/spec/api/spy/spy_spec.rb +0 -49
  57. data/spec/api/strong/strong_spec.rb +0 -87
  58. data/spec/api/stub/stub_spec.rb +0 -152
  59. data/spec/core_spec_suite.rb +0 -19
  60. data/spec/environment_fixture_setup.rb +0 -8
  61. data/spec/minitest_spec_suite.rb +0 -21
  62. data/spec/proc_from_block_spec.rb +0 -14
  63. data/spec/rr/adapters/rr_methods_argument_matcher_spec.rb +0 -67
  64. data/spec/rr/adapters/rr_methods_creator_spec.rb +0 -137
  65. data/spec/rr/adapters/rr_methods_space_spec.rb +0 -98
  66. data/spec/rr/adapters/rr_methods_spec_helper.rb +0 -11
  67. data/spec/rr/adapters/rr_methods_times_matcher_spec.rb +0 -13
  68. data/spec/rr/double_definitions/child_double_definition_creator_spec.rb +0 -112
  69. data/spec/rr/double_definitions/double_definition_create_blank_slate_spec.rb +0 -91
  70. data/spec/rr/double_definitions/double_definition_create_spec.rb +0 -443
  71. data/spec/rr/double_injection/double_injection_spec.rb +0 -546
  72. data/spec/rr/double_injection/double_injection_verify_spec.rb +0 -29
  73. data/spec/rr/errors/rr_error_spec.rb +0 -67
  74. data/spec/rr/expectations/any_argument_expectation_spec.rb +0 -47
  75. data/spec/rr/expectations/anything_argument_equality_expectation_spec.rb +0 -14
  76. data/spec/rr/expectations/argument_equality_expectation_spec.rb +0 -135
  77. data/spec/rr/expectations/boolean_argument_equality_expectation_spec.rb +0 -34
  78. data/spec/rr/expectations/hash_including_argument_equality_expectation_spec.rb +0 -82
  79. data/spec/rr/expectations/hash_including_spec.rb +0 -17
  80. data/spec/rr/expectations/satisfy_argument_equality_expectation_spec.rb +0 -59
  81. data/spec/rr/expectations/satisfy_spec.rb +0 -14
  82. data/spec/rr/expectations/times_called_expectation/times_called_expectation_any_times_spec.rb +0 -22
  83. data/spec/rr/expectations/times_called_expectation/times_called_expectation_at_least_spec.rb +0 -37
  84. data/spec/rr/expectations/times_called_expectation/times_called_expectation_at_most_spec.rb +0 -43
  85. data/spec/rr/expectations/times_called_expectation/times_called_expectation_helper.rb +0 -15
  86. data/spec/rr/expectations/times_called_expectation/times_called_expectation_integer_spec.rb +0 -58
  87. data/spec/rr/expectations/times_called_expectation/times_called_expectation_proc_spec.rb +0 -35
  88. data/spec/rr/expectations/times_called_expectation/times_called_expectation_range_spec.rb +0 -39
  89. data/spec/rr/minitest/minitest_integration_test.rb +0 -59
  90. data/spec/rr/minitest/test_helper.rb +0 -7
  91. data/spec/rr/rspec/invocation_matcher_spec.rb +0 -279
  92. data/spec/rr/rspec/rspec_adapter_spec.rb +0 -63
  93. data/spec/rr/rspec/rspec_backtrace_tweaking_spec.rb +0 -31
  94. data/spec/rr/rspec/rspec_backtrace_tweaking_spec_fixture.rb +0 -11
  95. data/spec/rr/rspec/rspec_usage_spec.rb +0 -86
  96. data/spec/rr/space/hash_with_object_id_key_spec.rb +0 -88
  97. data/spec/rr/space/space_spec.rb +0 -596
  98. data/spec/rr/test_unit/test_helper.rb +0 -7
  99. data/spec/rr/test_unit/test_unit_backtrace_test.rb +0 -36
  100. data/spec/rr/test_unit/test_unit_integration_test.rb +0 -59
  101. data/spec/rr/times_called_matchers/any_times_matcher_spec.rb +0 -47
  102. data/spec/rr/times_called_matchers/at_least_matcher_spec.rb +0 -55
  103. data/spec/rr/times_called_matchers/at_most_matcher_spec.rb +0 -70
  104. data/spec/rr/times_called_matchers/integer_matcher_spec.rb +0 -70
  105. data/spec/rr/times_called_matchers/proc_matcher_spec.rb +0 -55
  106. data/spec/rr/times_called_matchers/range_matcher_spec.rb +0 -76
  107. data/spec/rr/times_called_matchers/times_called_matcher_spec.rb +0 -118
  108. data/spec/rr/wildcard_matchers/anything_spec.rb +0 -24
  109. data/spec/rr/wildcard_matchers/boolean_spec.rb +0 -36
  110. data/spec/rr/wildcard_matchers/duck_type_spec.rb +0 -52
  111. data/spec/rr/wildcard_matchers/is_a_spec.rb +0 -32
  112. data/spec/rr/wildcard_matchers/numeric_spec.rb +0 -32
  113. data/spec/rr/wildcard_matchers/range_spec.rb +0 -35
  114. data/spec/rr/wildcard_matchers/regexp_spec.rb +0 -43
  115. data/spec/rr_spec.rb +0 -28
  116. data/spec/rspec_spec_suite.rb +0 -17
  117. data/spec/spec.opts +0 -10
  118. data/spec/spec_helper.rb +0 -41
  119. data/spec/spec_suite.rb +0 -54
  120. data/spec/spy_verification_spec.rb +0 -129
  121. data/spec/test_unit_spec_suite.rb +0 -21
@@ -1,443 +0,0 @@
1
- require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
-
3
- module RR
4
- module DoubleDefinitions
5
- describe DoubleDefinitionCreate do
6
- attr_reader :double_definition_create, :subject, :strategy_method_name
7
- it_should_behave_like "Swapped Space"
8
- before(:each) do
9
- @subject = Object.new
10
- @double_definition_create = DoubleDefinitionCreate.new
11
- end
12
-
13
- describe "#root_subject" do
14
- it "returns #subject" do
15
- double_definition_create.stub(subject).foobar
16
- double_definition_create.root_subject.should == subject
17
- end
18
- end
19
-
20
- describe "StrategySetupMethods" do
21
- describe "normal strategy definitions" do
22
- def call_strategy(*args, &block)
23
- double_definition_create.__send__(strategy_method_name, *args, &block)
24
- end
25
-
26
- describe "#mock" do
27
- before do
28
- @strategy_method_name = :mock
29
- end
30
-
31
- context "when passing no args" do
32
- it "returns self" do
33
- call_strategy.should === double_definition_create
34
- end
35
- end
36
-
37
- context "when passed a subject and a method_name argument" do
38
- it "creates a mock Double for method" do
39
- double_definition = double_definition_create.mock(subject, :foobar).returns {:baz}
40
- double_definition.times_matcher.should == RR::TimesCalledMatchers::IntegerMatcher.new(1)
41
- double_definition.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
42
- double_definition.argument_expectation.expected_arguments.should == []
43
- subject.foobar.should == :baz
44
- end
45
- end
46
- end
47
-
48
- describe "#stub" do
49
- before do
50
- @strategy_method_name = :stub
51
- end
52
-
53
- context "when passing no args" do
54
- it "returns self" do
55
- call_strategy.should === double_definition_create
56
- end
57
- end
58
-
59
- context "when passed subject and a method_name argument" do
60
- it "creates a stub Double for method when passed a method_name argument" do
61
- double_definition = double_definition_create.stub(subject, :foobar).returns {:baz}
62
- double_definition.times_matcher.should == RR::TimesCalledMatchers::AnyTimesMatcher.new
63
- double_definition.argument_expectation.class.should == RR::Expectations::AnyArgumentExpectation
64
- subject.foobar.should == :baz
65
- end
66
- end
67
- end
68
-
69
- describe "#dont_allow" do
70
- before do
71
- @strategy_method_name = :dont_allow
72
- end
73
-
74
- context "when passing no args" do
75
- it "returns self" do
76
- call_strategy.should === double_definition_create
77
- end
78
- end
79
-
80
- context "when passed a subject and a method_name argument_expectation" do
81
- it "creates a mock Double for method" do
82
- double_definition = double_definition_create.dont_allow(subject, :foobar)
83
- double_definition.times_matcher.should == RR::TimesCalledMatchers::NeverMatcher.new
84
- double_definition.argument_expectation.class.should == RR::Expectations::AnyArgumentExpectation
85
-
86
- lambda do
87
- subject.foobar
88
- end.should raise_error(RR::Errors::TimesCalledError)
89
- RR.reset
90
- end
91
- end
92
- end
93
- end
94
-
95
- describe "! strategy definitions" do
96
- attr_reader :strategy_method_name
97
- def call_strategy(*args, &definition_eval_block)
98
- double_definition_create.__send__(strategy_method_name, *args, &definition_eval_block)
99
- end
100
-
101
- describe "#mock!" do
102
- before do
103
- @strategy_method_name = :mock!
104
- end
105
-
106
- context "when passed a method_name argument" do
107
- it "sets #verification_strategy to Mock" do
108
- double_definition_create.mock!(:foobar)
109
- double_definition_create.verification_strategy.class.should == Strategies::Verification::Mock
110
- lambda {RR.verify}.should raise_error(::RR::Errors::TimesCalledError)
111
- end
112
- end
113
- end
114
-
115
- describe "#stub!" do
116
- before do
117
- @strategy_method_name = :stub!
118
- end
119
-
120
- context "when passed a method_name argument" do
121
- it "sets #verification_strategy to Stub" do
122
- double_definition_create.stub!(:foobar)
123
- double_definition_create.verification_strategy.class.should == Strategies::Verification::Stub
124
- end
125
- end
126
- end
127
-
128
- describe "#dont_allow!" do
129
- before do
130
- @strategy_method_name = :dont_allow!
131
- end
132
-
133
- context "when passed a method_name argument" do
134
- it "sets #verification_strategy to DontAllow" do
135
- double_definition_create.dont_allow!(:foobar)
136
- double_definition_create.verification_strategy.class.should == Strategies::Verification::DontAllow
137
- end
138
- end
139
- end
140
- end
141
-
142
- describe "#stub.proxy" do
143
- before do
144
- class << subject
145
- def foobar(*args)
146
- :original_foobar
147
- end
148
- end
149
- end
150
-
151
- context "when passed a method_name argument" do
152
- it "creates a proxy Double for method" do
153
- double_definition = double_definition_create.stub.proxy(subject, :foobar).after_call {:baz}
154
- double_definition.times_matcher.should == RR::TimesCalledMatchers::AnyTimesMatcher.new
155
- double_definition.argument_expectation.class.should == RR::Expectations::AnyArgumentExpectation
156
- subject.foobar.should == :baz
157
- end
158
- end
159
- end
160
-
161
- describe "#instance_of" do
162
- context "when not passed a class" do
163
- it "raises an ArgumentError" do
164
- lambda do
165
- double_definition_create.instance_of(Object.new).foobar
166
- end.should raise_error(ArgumentError, "instance_of only accepts class objects")
167
- end
168
- end
169
-
170
- context "when passed a method_name argument" do
171
- it "creates a proxy Double for method" do
172
- klass = Class.new
173
- double_definition = double_definition_create.stub.instance_of(klass, :foobar).returns {:baz}
174
- double_definition.times_matcher.should == RR::TimesCalledMatchers::AnyTimesMatcher.new
175
- double_definition.argument_expectation.class.should == RR::Expectations::AnyArgumentExpectation
176
- klass.new.foobar.should == :baz
177
- end
178
- end
179
- end
180
-
181
- describe "#instance_of.mock" do
182
- before do
183
- @klass = Class.new
184
- end
185
-
186
- # context "when passed no arguments" do
187
- # it "returns a DoubleDefinitiondouble_definition_create" do
188
- # instance_of.instance_of.should be_instance_of(DoubleDefinitionCreate)
189
- # end
190
- # end
191
-
192
- context "when passed a method_name argument" do
193
- it "creates a instance_of Double for method" do
194
- double_definition = instance_of.mock(@klass, :foobar)
195
- double_definition.with(1, 2) {:baz}
196
- double_definition.times_matcher.should == RR::TimesCalledMatchers::IntegerMatcher.new(1)
197
- double_definition.argument_expectation.class.should == RR::Expectations::ArgumentEqualityExpectation
198
- double_definition.argument_expectation.expected_arguments.should == [1, 2]
199
-
200
- @klass.new.foobar(1, 2).should == :baz
201
- end
202
- end
203
- end
204
- end
205
-
206
- describe "StrategyExecutionMethods" do
207
- describe "#create" do
208
- context "when #verification_strategy is a Mock" do
209
- context "when #implementation_strategy is a Reimplementation" do
210
- before do
211
- double_definition_create.mock(subject)
212
- end
213
-
214
- it "sets expectation on the #subject that it will be sent the method_name once with the passed-in arguments" do
215
- mock(subject).foobar(1, 2)
216
- subject.foobar(1, 2)
217
- lambda {subject.foobar(1, 2)}.should raise_error(RR::Errors::TimesCalledError)
218
- lambda {RR.verify}.should raise_error(RR::Errors::TimesCalledError)
219
- end
220
-
221
- describe "#subject.method_name being called" do
222
- it "returns the return value of the Double#returns block" do
223
- double_definition_create.call(:foobar, 1, 2) {:baz}
224
- subject.foobar(1, 2).should == :baz
225
- end
226
- end
227
- end
228
-
229
- context "when #implementation_strategy is a Proxy" do
230
- before do
231
- double_definition_create.mock
232
- double_definition_create.proxy(subject)
233
- end
234
-
235
- it "sets expectation on the #subject that it will be sent the method_name once with the passed-in arguments" do
236
- def subject.foobar(*args)
237
- :baz
238
- end
239
- mock(subject).foobar(1, 2)
240
-
241
- subject.foobar(1, 2)
242
- lambda {subject.foobar(1, 2)}.should raise_error(RR::Errors::TimesCalledError)
243
- lambda {RR.verify}.should raise_error(RR::Errors::TimesCalledError)
244
- end
245
-
246
- describe "#subject.method_name being called" do
247
- it "calls the original method" do
248
- original_method_called = false
249
- (class << subject; self; end).class_eval do
250
- define_method(:foobar) do |*args|
251
- original_method_called = true
252
- end
253
- end
254
- double_definition_create.call(:foobar, 1, 2)
255
- subject.foobar(1, 2)
256
- original_method_called.should be_true
257
- end
258
-
259
- context "when not passed a block" do
260
- it "returns the value of the original method" do
261
- def subject.foobar(*args)
262
- :baz;
263
- end
264
- double_definition_create.call(:foobar, 1, 2)
265
- subject.foobar(1, 2).should == :baz
266
- end
267
- end
268
-
269
- context "when passed a block" do
270
- attr_reader :real_value
271
- before do
272
- @real_value = real_value = Object.new
273
- (class << subject; self; end).class_eval do
274
- define_method(:foobar) {|arg1, arg2| real_value}
275
- end
276
- end
277
-
278
- it "calls the block with the return value of the original method" do
279
- double_definition_create.call(:foobar, 1, 2) do |value|
280
- mock(value).a_method {99}
281
- value
282
- end
283
- subject.foobar(1, 2)
284
- real_value.a_method.should == 99
285
- end
286
-
287
- it "returns the return value of the block" do
288
- double_definition_create.call(:foobar, 1, 2) do |value|
289
- :something_else
290
- end
291
- subject.foobar(1, 2).should == :something_else
292
- end
293
- end
294
- end
295
- end
296
- end
297
-
298
- context "when #verification_strategy is a Stub" do
299
- context "when #implementation_strategy is a Reimplementation" do
300
- before do
301
- double_definition_create.stub(subject)
302
- end
303
-
304
- context "when not passed a block" do
305
- it "returns nil" do
306
- double_definition_create.call(:foobar)
307
- subject.foobar.should be_nil
308
- end
309
- end
310
-
311
- context "when passed a block" do
312
- describe "#subject.method_name being called" do
313
- it "returns the return value of the block" do
314
- double_definition_create.call(:foobar) {:baz}
315
- subject.foobar.should == :baz
316
- end
317
- end
318
- end
319
-
320
- context "when not passed args" do
321
- describe "#subject.method_name being called with any arguments" do
322
- it "invokes the implementation of the Stub" do
323
- double_definition_create.call(:foobar) {:baz}
324
- subject.foobar(1, 2).should == :baz
325
- subject.foobar().should == :baz
326
- subject.foobar([]).should == :baz
327
- end
328
- end
329
- end
330
-
331
- context "when passed args" do
332
- describe "#subject.method_name being called with the passed-in arguments" do
333
- it "invokes the implementation of the Stub" do
334
- double_definition_create.call(:foobar, 1, 2) {:baz}
335
- subject.foobar(1, 2).should == :baz
336
- end
337
- end
338
-
339
- describe "#subject.method_name being called with different arguments" do
340
- it "raises a DoubleNotFoundError" do
341
- double_definition_create.call(:foobar, 1, 2) {:baz}
342
- lambda do
343
- subject.foobar
344
- end.should raise_error(RR::Errors::DoubleNotFoundError)
345
- end
346
- end
347
- end
348
- end
349
-
350
- context "when #implementation_strategy is a Proxy" do
351
- before do
352
- def subject.foobar(*args)
353
- :original_return_value
354
- end
355
- double_definition_create.stub
356
- double_definition_create.proxy(subject)
357
- end
358
-
359
- context "when not passed a block" do
360
- describe "#subject.method_name being called" do
361
- it "invokes the original implementanion" do
362
- double_definition_create.call(:foobar)
363
- subject.foobar.should == :original_return_value
364
- end
365
- end
366
- end
367
-
368
- context "when passed a block" do
369
- describe "#subject.method_name being called" do
370
- it "invokes the original implementanion and invokes the block with the return value of the original implementanion" do
371
- passed_in_value = nil
372
- double_definition_create.call(:foobar) do |original_return_value|
373
- passed_in_value = original_return_value
374
- end
375
- subject.foobar
376
- passed_in_value.should == :original_return_value
377
- end
378
-
379
- it "returns the return value of the block" do
380
- double_definition_create.call(:foobar) do |original_return_value|
381
- :new_return_value
382
- end
383
- subject.foobar.should == :new_return_value
384
- end
385
- end
386
- end
387
-
388
- context "when passed args" do
389
- describe "#subject.method_name being called with the passed-in arguments" do
390
- it "invokes the implementation of the Stub" do
391
- double_definition_create.call(:foobar, 1, 2) {:baz}
392
- subject.foobar(1, 2).should == :baz
393
- end
394
- end
395
-
396
- describe "#subject.method_name being called with different arguments" do
397
- it "raises a DoubleNotFoundError" do
398
- double_definition_create.call(:foobar, 1, 2) {:baz}
399
- lambda do
400
- subject.foobar
401
- end.should raise_error(RR::Errors::DoubleNotFoundError)
402
- end
403
- end
404
- end
405
- end
406
- end
407
-
408
- context "when #verification_strategy is a DontAllow" do
409
- before do
410
- double_definition_create.dont_allow(subject)
411
- end
412
-
413
- context "when not passed args" do
414
- describe "#subject.method_name being called with any arguments" do
415
- it "raises a TimesCalledError" do
416
- double_definition_create.call(:foobar)
417
- lambda {subject.foobar}.should raise_error(RR::Errors::TimesCalledError)
418
- lambda {subject.foobar(1, 2)}.should raise_error(RR::Errors::TimesCalledError)
419
- end
420
- end
421
- end
422
-
423
- context "when passed args" do
424
- describe "#subject.method_name being called with the passed-in arguments" do
425
- it "raises a TimesCalledError" do
426
- double_definition_create.call(:foobar, 1, 2)
427
- lambda {subject.foobar(1, 2)}.should raise_error(RR::Errors::TimesCalledError)
428
- end
429
- end
430
-
431
- describe "#subject.method_name being called with different arguments" do
432
- it "raises a DoubleNotFoundError" do
433
- double_definition_create.call(:foobar, 1, 2)
434
- lambda {subject.foobar()}.should raise_error(RR::Errors::DoubleNotFoundError)
435
- end
436
- end
437
- end
438
- end
439
- end
440
- end
441
- end
442
- end
443
- end
@@ -1,546 +0,0 @@
1
- require File.expand_path("#{File.dirname(__FILE__)}/../../spec_helper")
2
-
3
- module RR
4
- module Injections
5
- describe DoubleInjection do
6
- attr_reader :subject, :method_name, :double_injection
7
- macro("sets up subject and method_name") do
8
- it "sets up subject and method_name" do
9
- double_injection.subject.should === subject
10
- double_injection.method_name.should == method_name.to_sym
11
- end
12
- end
13
-
14
- before do
15
- @subject = Object.new
16
- end
17
-
18
- describe "mock/stub" do
19
- context "when the subject responds to the injected method" do
20
- before do
21
- class << subject
22
- attr_reader :original_foobar_called
23
-
24
- def foobar
25
- @original_foobar_called = true
26
- :original_foobar
27
- end
28
- end
29
-
30
- subject.should respond_to(:foobar)
31
- (!!subject.methods.detect {|method| method.to_sym == :foobar}).should be_true
32
- stub(subject).foobar {:new_foobar}
33
- end
34
-
35
- describe "being bound" do
36
- it "sets __rr__original_{method_name} to the original method" do
37
- subject.__rr__original_foobar.should == :original_foobar
38
- end
39
-
40
- describe "being called" do
41
- it "returns the return value of the block" do
42
- subject.foobar.should == :new_foobar
43
- end
44
-
45
- it "does not call the original method" do
46
- subject.foobar
47
- subject.original_foobar_called.should be_nil
48
- end
49
- end
50
-
51
- describe "being reset" do
52
- before do
53
- RR::Space.reset_double(subject, :foobar)
54
- end
55
-
56
- it "rebinds the original method" do
57
- subject.foobar.should == :original_foobar
58
- end
59
-
60
- it "removes __rr__original_{method_name}" do
61
- subject.should_not respond_to(:__rr__original_foobar)
62
- end
63
- end
64
- end
65
- end
66
-
67
- context "when the subject does not respond to the injected method" do
68
- before do
69
- subject.should_not respond_to(:foobar)
70
- subject.methods.should_not include('foobar')
71
- stub(subject).foobar {:new_foobar}
72
- end
73
-
74
- it "does not set __rr__original_{method_name} to the original method" do
75
- subject.should_not respond_to(:__rr__original_foobar)
76
- end
77
-
78
- describe "being called" do
79
- it "calls the newly defined method" do
80
- subject.foobar.should == :new_foobar
81
- end
82
- end
83
-
84
- describe "being reset" do
85
- before do
86
- RR::Space.reset_double(subject, :foobar)
87
- end
88
-
89
- it "unsets the foobar method" do
90
- subject.should_not respond_to(:foobar)
91
- subject.methods.should_not include('foobar')
92
- end
93
- end
94
- end
95
-
96
- context "when the subject redefines respond_to?" do
97
- it "does not try to call the implementation" do
98
- class << subject
99
- def respond_to?(method_symbol, include_private = false)
100
- method_symbol == :foobar
101
- end
102
- end
103
- mock(@subject).foobar
104
- @subject.foobar.should == nil
105
- end
106
- end
107
- end
108
-
109
- describe "mock/stub + proxy" do
110
- context "when the subject responds to the injected method" do
111
- context "when the subject has the method defined" do
112
- describe "being bound" do
113
- before do
114
- def subject.foobar
115
- :original_foobar
116
- end
117
-
118
- subject.should respond_to(:foobar)
119
- (!!subject.methods.detect {|method| method.to_sym == :foobar}).should be_true
120
- stub.proxy(subject).foobar {:new_foobar}
121
- end
122
-
123
- it "aliases the original method to __rr__original_{method_name}" do
124
- subject.__rr__original_foobar.should == :original_foobar
125
- end
126
-
127
- it "replaces the original method with the new method" do
128
- subject.foobar.should == :new_foobar
129
- end
130
-
131
- describe "being called" do
132
- it "calls the original method first and sends it into the block" do
133
- original_return_value = nil
134
- stub.proxy(subject).foobar {|arg| original_return_value = arg; :new_foobar}
135
- subject.foobar.should == :new_foobar
136
- original_return_value.should == :original_foobar
137
- end
138
- end
139
-
140
- describe "being reset" do
141
- before do
142
- RR::Space.reset_double(subject, :foobar)
143
- end
144
-
145
- it "rebinds the original method" do
146
- subject.foobar.should == :original_foobar
147
- end
148
-
149
- it "removes __rr__original_{method_name}" do
150
- subject.should_not respond_to(:__rr__original_foobar)
151
- end
152
- end
153
- end
154
- end
155
-
156
- context "when the subject does not have the method defined" do
157
- describe "being bound" do
158
- context "when the subject has not been previously bound to" do
159
- before do
160
- setup_subject
161
-
162
- subject.should respond_to(:foobar)
163
- stub.proxy(subject).foobar {:new_foobar}
164
- end
165
-
166
- def setup_subject
167
- def subject.respond_to?(method_name)
168
- if method_name.to_sym == :foobar
169
- true
170
- else
171
- super
172
- end
173
- end
174
- end
175
-
176
- it "does not define __rr__original_{method_name}" do
177
- subject.methods.should_not include("__rr__original_foobar")
178
- end
179
-
180
- context "when method is defined after being bound and before being called" do
181
- def setup_subject
182
- super
183
- def subject.foobar
184
- :original_foobar
185
- end
186
- end
187
-
188
- describe "being called" do
189
- it "defines __rr__original_{method_name} to be the lazily created method" do
190
- (!!subject.methods.detect {|method| method.to_sym == :__rr__original_foobar}).should be_true
191
- subject.__rr__original_foobar.should == :original_foobar
192
- end
193
-
194
- it "calls the original method first and sends it into the block" do
195
- original_return_value = nil
196
- stub.proxy(subject).foobar {|arg| original_return_value = arg; :new_foobar}
197
- subject.foobar.should == :new_foobar
198
- original_return_value.should == :original_foobar
199
- end
200
- end
201
-
202
- describe "being reset" do
203
- before do
204
- RR::Space.reset_double(subject, :foobar)
205
- end
206
-
207
- it "rebinds the original method" do
208
- subject.foobar.should == :original_foobar
209
- end
210
-
211
- it "removes __rr__original_{method_name}" do
212
- subject.should_not respond_to(:__rr__original_foobar)
213
- end
214
- end
215
- end
216
-
217
- context "when method is still not defined" do
218
- context "when the method is lazily created" do
219
- def setup_subject
220
- super
221
- def subject.method_missing(method_name, *args, &block)
222
- if method_name.to_sym == :foobar
223
- def self.foobar
224
- :original_foobar
225
- end
226
-
227
- foobar
228
- else
229
- super
230
- end
231
- end
232
- end
233
-
234
- describe "being called" do
235
- it "defines __rr__original_{method_name} to be the lazily created method" do
236
- subject.foobar
237
- (!!subject.methods.detect {|method| method.to_sym == :__rr__original_foobar}).should be_true
238
- subject.__rr__original_foobar.should == :original_foobar
239
- end
240
-
241
- it "calls the lazily created method and returns the injected method return value" do
242
- original_return_value = nil
243
- stub.proxy(subject).foobar {|arg| original_return_value = arg; :new_foobar}
244
- subject.foobar.should == :new_foobar
245
- original_return_value.should == :original_foobar
246
- end
247
- end
248
-
249
- describe "being reset" do
250
- context "when reset before being called" do
251
- before do
252
- RR::Space.reset_double(subject, :foobar)
253
- end
254
-
255
- it "rebinds the original method" do
256
- subject.foobar.should == :original_foobar
257
- end
258
-
259
- it "removes __rr__original_{method_name}" do
260
- subject.should_not respond_to(:__rr__original_foobar)
261
- end
262
- end
263
- end
264
- end
265
-
266
- context "when the method is not lazily created (handled in method_missing)" do
267
- def setup_subject
268
- super
269
- def subject.method_missing(method_name, *args, &block)
270
- if method_name.to_sym == :foobar
271
- :original_foobar
272
- else
273
- super
274
- end
275
- end
276
- end
277
-
278
- describe "being called" do
279
- it "does not define the __rr__original_{method_name}" do
280
- subject.foobar
281
- subject.methods.should_not include("__rr__original_foobar")
282
- end
283
-
284
- it "calls the lazily created method and returns the injected method return value" do
285
- original_return_value = nil
286
- stub.proxy(subject).foobar {|arg| original_return_value = arg; :new_foobar}
287
- subject.foobar.should == :new_foobar
288
- original_return_value.should == :original_foobar
289
- end
290
- end
291
-
292
- describe "being reset" do
293
- before do
294
- RR::Space.reset_double(subject, :foobar)
295
- end
296
-
297
- it "rebinds the original method" do
298
- subject.foobar.should == :original_foobar
299
- end
300
-
301
- it "removes __rr__original_{method_name}" do
302
- subject.should_not respond_to(:__rr__original_foobar)
303
- end
304
- end
305
- end
306
- end
307
- end
308
-
309
- context "when the subject has been previously bound to" do
310
- before do
311
- setup_subject
312
-
313
- subject.should respond_to(:foobar)
314
- stub.proxy(subject).baz {:new_baz}
315
- stub.proxy(subject).foobar {:new_foobar}
316
- end
317
-
318
- def setup_subject
319
- def subject.respond_to?(method_name)
320
- if method_name.to_sym == :foobar || method_name.to_sym == :baz
321
- true
322
- else
323
- super
324
- end
325
- end
326
- end
327
-
328
- it "does not define __rr__original_{method_name}" do
329
- subject.methods.should_not include("__rr__original_foobar")
330
- end
331
-
332
- context "when method is defined after being bound and before being called" do
333
- def setup_subject
334
- super
335
- def subject.foobar
336
- :original_foobar
337
- end
338
- end
339
-
340
- describe "being called" do
341
- it "defines __rr__original_{method_name} to be the lazily created method" do
342
- (!!subject.methods.detect {|method| method.to_sym == :__rr__original_foobar}).should be_true
343
- subject.__rr__original_foobar.should == :original_foobar
344
- end
345
-
346
- it "calls the original method first and sends it into the block" do
347
- original_return_value = nil
348
- stub.proxy(subject).foobar {|arg| original_return_value = arg; :new_foobar}
349
- subject.foobar.should == :new_foobar
350
- original_return_value.should == :original_foobar
351
- end
352
- end
353
-
354
- describe "being reset" do
355
- before do
356
- RR::Space.reset_double(subject, :foobar)
357
- end
358
-
359
- it "rebinds the original method" do
360
- subject.foobar.should == :original_foobar
361
- end
362
-
363
- it "removes __rr__original_{method_name}" do
364
- subject.should_not respond_to(:__rr__original_foobar)
365
- end
366
- end
367
- end
368
-
369
- context "when method is still not defined" do
370
- context "when the method is lazily created" do
371
- def setup_subject
372
- super
373
- def subject.method_missing(method_name, *args, &block)
374
- if method_name.to_sym == :foobar
375
- def self.foobar
376
- :original_foobar
377
- end
378
-
379
- foobar
380
- else
381
- super
382
- end
383
- end
384
- end
385
-
386
- describe "being called" do
387
- it "defines __rr__original_{method_name} to be the lazily created method" do
388
- subject.foobar
389
- (!!subject.methods.detect {|method| method.to_sym == :__rr__original_foobar}).should be_true
390
- subject.__rr__original_foobar.should == :original_foobar
391
- end
392
-
393
- it "calls the lazily created method and returns the injected method return value" do
394
- original_return_value = nil
395
- stub.proxy(subject).foobar {|arg| original_return_value = arg; :new_foobar}
396
- subject.foobar.should == :new_foobar
397
- original_return_value.should == :original_foobar
398
- end
399
- end
400
-
401
- describe "being reset" do
402
- context "when reset before being called" do
403
- before do
404
- RR::Space.reset_double(subject, :foobar)
405
- end
406
-
407
- it "rebinds the original method" do
408
- subject.foobar.should == :original_foobar
409
- end
410
-
411
- it "removes __rr__original_{method_name}" do
412
- subject.should_not respond_to(:__rr__original_foobar)
413
- end
414
- end
415
- end
416
- end
417
-
418
- context "when the method is not lazily created (handled in method_missing)" do
419
- def setup_subject
420
- super
421
- def subject.method_missing(method_name, *args, &block)
422
- if method_name.to_sym == :foobar
423
- :original_foobar
424
- else
425
- super
426
- end
427
- end
428
- end
429
-
430
- describe "being called" do
431
- it "does not define the __rr__original_{method_name}" do
432
- subject.foobar
433
- subject.methods.should_not include("__rr__original_foobar")
434
- end
435
-
436
- it "calls the lazily created method and returns the injected method return value" do
437
- original_return_value = nil
438
- stub.proxy(subject).foobar {|arg| original_return_value = arg; :new_foobar}
439
- subject.foobar.should == :new_foobar
440
- original_return_value.should == :original_foobar
441
- end
442
- end
443
-
444
- describe "being reset" do
445
- before do
446
- RR::Space.reset_double(subject, :foobar)
447
- end
448
-
449
- it "rebinds the original method" do
450
- subject.foobar.should == :original_foobar
451
- end
452
-
453
- it "removes __rr__original_{method_name}" do
454
- subject.should_not respond_to(:__rr__original_foobar)
455
- end
456
- end
457
- end
458
- end
459
- end
460
- end
461
- end
462
- end
463
-
464
- context "when the subject does not respond to the injected method" do
465
- context "when the subject responds to the method via method_missing" do
466
- describe "being bound" do
467
- before do
468
- subject.should_not respond_to(:foobar)
469
- subject.methods.should_not include('foobar')
470
- class << subject
471
- def method_missing(method_name, *args, &block)
472
- if method_name == :foobar
473
- :original_foobar
474
- else
475
- super
476
- end
477
- end
478
- end
479
- stub.proxy(subject).foobar {:new_foobar}
480
- end
481
-
482
- it "adds the method to the subject" do
483
- subject.should respond_to(:foobar)
484
- (!!subject.methods.detect {|method| method.to_sym == :foobar}).should be_true
485
- end
486
-
487
- describe "being called" do
488
- it "calls the original method first and sends it into the block" do
489
- original_return_value = nil
490
- stub.proxy(subject).foobar {|arg| original_return_value = arg; :new_foobar}
491
- subject.foobar.should == :new_foobar
492
- original_return_value.should == :original_foobar
493
- end
494
- end
495
-
496
- describe "being reset" do
497
- before do
498
- RR::Space.reset_double(subject, :foobar)
499
- end
500
-
501
- it "unsets the foobar method" do
502
- subject.should_not respond_to(:foobar)
503
- subject.methods.should_not include('foobar')
504
- end
505
- end
506
- end
507
- end
508
-
509
- context "when the subject would raise a NoMethodError when the method is called" do
510
- describe "being bound" do
511
- before do
512
- subject.should_not respond_to(:foobar)
513
- subject.methods.should_not include('foobar')
514
- stub.proxy(subject).foobar {:new_foobar}
515
- end
516
-
517
- it "adds the method to the subject" do
518
- subject.should respond_to(:foobar)
519
- (!!subject.methods.detect {|method| method.to_sym == :foobar}).should be_true
520
- end
521
-
522
- describe "being called" do
523
- it "raises a NoMethodError" do
524
- lambda do
525
- subject.foobar
526
- end.should raise_error(NoMethodError)
527
- end
528
- end
529
-
530
- describe "being reset" do
531
- before do
532
- RR::Space.reset_double(subject, :foobar)
533
- end
534
-
535
- it "unsets the foobar method" do
536
- subject.should_not respond_to(:foobar)
537
- subject.methods.should_not include('foobar')
538
- end
539
- end
540
- end
541
- end
542
- end
543
- end
544
- end
545
- end
546
- end