spy 0.1.0 → 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/.travis.yml +5 -0
- data/Gemfile +1 -0
- data/README.md +22 -7
- data/Rakefile +2 -0
- data/lib/spy.rb +39 -6
- data/lib/spy/agency.rb +42 -27
- data/lib/spy/call_log.rb +26 -0
- data/lib/spy/constant.rb +72 -14
- data/lib/spy/core_ext/marshal.rb +1 -0
- data/lib/spy/double.rb +17 -0
- data/lib/spy/nest.rb +27 -0
- data/lib/spy/subroutine.rb +146 -44
- data/lib/spy/version.rb +1 -1
- data/spec/spy/any_instance_spec.rb +518 -0
- data/spec/spy/mock_spec.rb +46 -554
- data/spec/spy/mutate_const_spec.rb +21 -63
- data/spec/spy/null_object_mock_spec.rb +11 -39
- data/spec/spy/partial_mock_spec.rb +3 -62
- data/spec/spy/stash_spec.rb +30 -37
- data/spec/spy/stub_spec.rb +0 -6
- data/spec/spy/to_ary_spec.rb +5 -5
- data/test/integration/test_constant_spying.rb +1 -1
- data/test/integration/test_instance_method.rb +32 -0
- data/test/integration/test_subroutine_spying.rb +7 -4
- data/test/spy/test_double.rb +4 -0
- data/test/spy/test_subroutine.rb +28 -3
- data/test/support/pen.rb +15 -0
- metadata +8 -30
- data/spec/spy/bug_report_10260_spec.rb +0 -8
- data/spec/spy/bug_report_10263_spec.rb +0 -24
- data/spec/spy/bug_report_496_spec.rb +0 -18
- data/spec/spy/bug_report_600_spec.rb +0 -24
- data/spec/spy/bug_report_7611_spec.rb +0 -16
- data/spec/spy/bug_report_8165_spec.rb +0 -31
- data/spec/spy/bug_report_830_spec.rb +0 -21
- data/spec/spy/bug_report_957_spec.rb +0 -22
- data/spec/spy/double_spec.rb +0 -12
- data/spec/spy/failing_argument_matchers_spec.rb +0 -94
- data/spec/spy/options_hash_spec.rb +0 -35
- data/spec/spy/precise_counts_spec.rb +0 -68
- data/spec/spy/stubbed_message_expectations_spec.rb +0 -47
- data/spec/spy/test_double_spec.rb +0 -54
data/spec/spy/mock_spec.rb
CHANGED
@@ -12,169 +12,29 @@ module Spy
|
|
12
12
|
expect(Spy.double("stuff")).not_to respond_to(:method_missing)
|
13
13
|
end
|
14
14
|
|
15
|
-
it "reports line number of expectation of unreceived message" do
|
16
|
-
expected_error_line = __LINE__; @double.should_receive(:wont_happen).with("x", 3)
|
17
|
-
begin
|
18
|
-
@double.rspec_verify
|
19
|
-
violated
|
20
|
-
rescue RSpec::Mocks::MockExpectationError => e
|
21
|
-
# NOTE - this regexp ended w/ $, but jruby adds extra info at the end of the line
|
22
|
-
expect(e.backtrace[0]).to match(/#{File.basename(__FILE__)}:#{expected_error_line}/)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
it "reports line number of expectation of unreceived message after #should_receive after similar stub" do
|
27
|
-
Spy.on(@double, :wont_happen)
|
28
|
-
expected_error_line = __LINE__; @double.should_receive(:wont_happen).with("x", 3)
|
29
|
-
begin
|
30
|
-
@double.rspec_verify
|
31
|
-
violated
|
32
|
-
rescue RSpec::Mocks::MockExpectationError => e
|
33
|
-
# NOTE - this regexp ended w/ $, but jruby adds extra info at the end of the line
|
34
|
-
expect(e.backtrace[0]).to match(/#{File.basename(__FILE__)}:#{expected_error_line}/)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
it "passes when not receiving message specified as not to be received" do
|
39
|
-
@double.should_not_receive(:not_expected)
|
40
|
-
@double.rspec_verify
|
41
|
-
end
|
42
|
-
|
43
|
-
it "warns when should_not_receive is followed by and_return" do
|
44
|
-
RSpec::Mocks.should_receive(:warn_deprecation).
|
45
|
-
with(/`and_return` with `should_not_receive` is deprecated/)
|
46
|
-
|
47
|
-
@double.should_not_receive(:do_something).and_return(1)
|
48
|
-
end
|
49
|
-
|
50
|
-
it "passes when receiving message specified as not to be received with different args" do
|
51
|
-
@double.should_not_receive(:message).with("unwanted text")
|
52
|
-
@double.should_receive(:message).with("other text")
|
53
|
-
@double.message "other text"
|
54
|
-
@double.rspec_verify
|
55
|
-
end
|
56
|
-
|
57
15
|
it "fails when receiving message specified as not to be received" do
|
58
|
-
@double
|
59
|
-
expect
|
60
|
-
@double.not_expected
|
61
|
-
violated
|
62
|
-
}.to raise_error(
|
63
|
-
RSpec::Mocks::MockExpectationError,
|
64
|
-
%Q|(Double "test double").not_expected(no args)\n expected: 0 times\n received: 1 time|
|
65
|
-
)
|
66
|
-
end
|
67
|
-
|
68
|
-
it "fails when receiving message specified as not to be received with args" do
|
69
|
-
@double.should_not_receive(:not_expected).with("unexpected text")
|
70
|
-
expect {
|
71
|
-
@double.not_expected("unexpected text")
|
72
|
-
violated
|
73
|
-
}.to raise_error(
|
74
|
-
RSpec::Mocks::MockExpectationError,
|
75
|
-
%Q|(Double "test double").not_expected("unexpected text")\n expected: 0 times\n received: 1 time|
|
76
|
-
)
|
77
|
-
end
|
78
|
-
|
79
|
-
it "passes when receiving message specified as not to be received with wrong args" do
|
80
|
-
@double.should_not_receive(:not_expected).with("unexpected text")
|
81
|
-
@double.not_expected "really unexpected text"
|
82
|
-
@double.rspec_verify
|
83
|
-
end
|
84
|
-
|
85
|
-
it "allows block to calculate return values" do
|
86
|
-
@double.should_receive(:something).with("a","b","c").and_return { |a,b,c| c+b+a }
|
87
|
-
expect(@double.something("a","b","c")).to eq "cba"
|
88
|
-
@double.rspec_verify
|
89
|
-
end
|
90
|
-
|
91
|
-
it "allows parameter as return value" do
|
92
|
-
@double.should_receive(:something).with("a","b","c").and_return("booh")
|
93
|
-
expect(@double.something("a","b","c")).to eq "booh"
|
94
|
-
@double.rspec_verify
|
95
|
-
end
|
96
|
-
|
97
|
-
it "returns the previously stubbed value if no return value is set" do
|
98
|
-
Spy.on(@double, :something).with("a","b","c").and_return(:stubbed_value)
|
99
|
-
@double.should_receive(:something).with("a","b","c")
|
100
|
-
expect(@double.something("a","b","c")).to eq :stubbed_value
|
101
|
-
@double.rspec_verify
|
102
|
-
end
|
103
|
-
|
104
|
-
it "returns nil if no return value is set and there is no previously stubbed value" do
|
105
|
-
@double.should_receive(:something).with("a","b","c")
|
106
|
-
expect(@double.something("a","b","c")).to be_nil
|
107
|
-
@double.rspec_verify
|
108
|
-
end
|
109
|
-
|
110
|
-
it "raises exception if args don't match when method called" do
|
111
|
-
@double.should_receive(:something).with("a","b","c").and_return("booh")
|
112
|
-
expect {
|
113
|
-
@double.something("a","d","c")
|
114
|
-
violated
|
115
|
-
}.to raise_error(RSpec::Mocks::MockExpectationError, "Double \"test double\" received :something with unexpected arguments\n expected: (\"a\", \"b\", \"c\")\n got: (\"a\", \"d\", \"c\")")
|
116
|
-
end
|
117
|
-
|
118
|
-
describe "even when a similar expectation with different arguments exist" do
|
119
|
-
it "raises exception if args don't match when method called, correctly reporting the offending arguments" do
|
120
|
-
@double.should_receive(:something).with("a","b","c").once
|
121
|
-
@double.should_receive(:something).with("z","x","c").once
|
122
|
-
expect {
|
123
|
-
@double.something("a","b","c")
|
124
|
-
@double.something("z","x","g")
|
125
|
-
}.to raise_error(RSpec::Mocks::MockExpectationError, "Double \"test double\" received :something with unexpected arguments\n expected: (\"z\", \"x\", \"c\")\n got: (\"z\", \"x\", \"g\")")
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
it "raises exception if args don't match when method called even when the method is stubbed" do
|
130
|
-
Spy.on(@double, :something)
|
131
|
-
@double.should_receive(:something).with("a","b","c")
|
132
|
-
expect {
|
133
|
-
@double.something("a","d","c")
|
134
|
-
@double.rspec_verify
|
135
|
-
}.to raise_error(RSpec::Mocks::MockExpectationError, "Double \"test double\" received :something with unexpected arguments\n expected: (\"a\", \"b\", \"c\")\n got: (\"a\", \"d\", \"c\")")
|
136
|
-
end
|
137
|
-
|
138
|
-
it "raises exception if args don't match when method called even when using null_object" do
|
139
|
-
@double = double("test double").as_null_object
|
140
|
-
@double.should_receive(:something).with("a","b","c")
|
141
|
-
expect {
|
142
|
-
@double.something("a","d","c")
|
143
|
-
@double.rspec_verify
|
144
|
-
}.to raise_error(RSpec::Mocks::MockExpectationError, "Double \"test double\" received :something with unexpected arguments\n expected: (\"a\", \"b\", \"c\")\n got: (\"a\", \"d\", \"c\")")
|
145
|
-
end
|
146
|
-
|
147
|
-
describe 'with a method that has a default argument' do
|
148
|
-
it "raises an exception if the arguments don't match when the method is called, correctly reporting the offending arguments" do
|
149
|
-
def @double.method_with_default_argument(arg={}); end
|
150
|
-
@double.should_receive(:method_with_default_argument).with({})
|
151
|
-
|
152
|
-
expect {
|
153
|
-
@double.method_with_default_argument(nil)
|
154
|
-
@double.rspec_verify
|
155
|
-
}.to raise_error(RSpec::Mocks::MockExpectationError, "Double \"test double\" received :method_with_default_argument with unexpected arguments\n expected: ({})\n got: (nil)")
|
156
|
-
end
|
16
|
+
spy = Spy.on(@double, :not_expected)
|
17
|
+
expect(spy).to_not have_been_called
|
157
18
|
end
|
158
19
|
|
159
20
|
it "fails if unexpected method called" do
|
160
21
|
expect {
|
161
22
|
@double.something("a","b","c")
|
162
|
-
|
163
|
-
}.to raise_error(RSpec::Mocks::MockExpectationError, "Double \"test double\" received unexpected message :something with (\"a\", \"b\", \"c\")")
|
23
|
+
}.to raise_error
|
164
24
|
end
|
165
25
|
|
166
26
|
it "uses block for expectation if provided" do
|
167
|
-
@double
|
27
|
+
spy = Spy.on(@double, :something).and_return do | a, b |
|
168
28
|
expect(a).to eq "a"
|
169
29
|
expect(b).to eq "b"
|
170
30
|
"booh"
|
171
31
|
end
|
172
32
|
expect(@double.something("a", "b")).to eq "booh"
|
173
|
-
|
33
|
+
expect(spy).to have_been_called
|
174
34
|
end
|
175
35
|
|
176
36
|
it "fails if expectation block fails" do
|
177
|
-
@double
|
37
|
+
Spy.on(@double, :something).and_return do | bool|
|
178
38
|
expect(bool).to be_true
|
179
39
|
end
|
180
40
|
|
@@ -183,32 +43,40 @@ module Spy
|
|
183
43
|
}.to raise_error(RSpec::Expectations::ExpectationNotMetError)
|
184
44
|
end
|
185
45
|
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
# and prevents the entire spec suite from running.
|
190
|
-
eval("@double.should_receive(:foo) {|&block| expect(block.call).to eq(:bar)}")
|
191
|
-
@double.foo { :bar }
|
46
|
+
it "passes proc to expectation block without an argument" do
|
47
|
+
spy = Spy.on(@double, :foo).and_return do |&block|
|
48
|
+
expect(block.call).to eq(:bar)
|
192
49
|
end
|
50
|
+
@double.foo { :bar }
|
51
|
+
expect(spy).to have_been_called
|
52
|
+
end
|
193
53
|
|
194
|
-
|
195
|
-
|
196
|
-
|
54
|
+
it "passes proc to expectation block with an argument" do
|
55
|
+
spy = Spy.on(@double, :foo).and_return do |arg, &block|
|
56
|
+
expect(block.call).to eq(:bar)
|
197
57
|
end
|
58
|
+
@double.foo(:arg) { :bar }
|
59
|
+
expect(spy).to have_been_called
|
60
|
+
end
|
198
61
|
|
199
|
-
|
200
|
-
|
201
|
-
|
62
|
+
it "passes proc to stub block without an argurment" do
|
63
|
+
spy = Spy.on(@double, :foo).and_return do |&block|
|
64
|
+
expect(block.call).to eq(:bar)
|
202
65
|
end
|
66
|
+
@double.foo { :bar }
|
67
|
+
expect(spy).to have_been_called
|
68
|
+
end
|
203
69
|
|
204
|
-
|
205
|
-
|
206
|
-
|
70
|
+
it "passes proc to stub block with an argument" do
|
71
|
+
spy = Spy.on(@double, :foo) do |arg, &block|
|
72
|
+
expect(block.call).to eq(:bar)
|
207
73
|
end
|
74
|
+
@double.foo(:arg) { :bar }
|
75
|
+
expect(spy).to have_been_called
|
208
76
|
end
|
209
77
|
|
210
78
|
it "fails right away when method defined as never is received" do
|
211
|
-
@double
|
79
|
+
Spy.on(@double, :not_expected).never
|
212
80
|
expect { @double.not_expected }.
|
213
81
|
to raise_error(RSpec::Mocks::MockExpectationError,
|
214
82
|
%Q|(Double "test double").not_expected(no args)\n expected: 0 times\n received: 1 time|
|
@@ -216,27 +84,27 @@ module Spy
|
|
216
84
|
end
|
217
85
|
|
218
86
|
it "raises RuntimeError by default" do
|
219
|
-
@double
|
87
|
+
Spy.on(@double, :something).and_raise
|
220
88
|
expect { @double.something }.to raise_error(RuntimeError)
|
221
89
|
end
|
222
90
|
|
223
91
|
it "raises RuntimeError with a message by default" do
|
224
|
-
@double
|
92
|
+
Spy.on(@double, :something).and_raise("error message")
|
225
93
|
expect { @double.something }.to raise_error(RuntimeError, "error message")
|
226
94
|
end
|
227
95
|
|
228
96
|
it "raises an exception of a given type without an error message" do
|
229
|
-
@double
|
97
|
+
Spy.on(@double, :something).and_raise(StandardError)
|
230
98
|
expect { @double.something }.to raise_error(StandardError)
|
231
99
|
end
|
232
100
|
|
233
101
|
it "raises an exception of a given type with a message" do
|
234
|
-
@double
|
102
|
+
Spy.on(@double, :something).and_raise(RuntimeError, "error message")
|
235
103
|
expect { @double.something }.to raise_error(RuntimeError, "error message")
|
236
104
|
end
|
237
105
|
|
238
106
|
it "raises a given instance of an exception" do
|
239
|
-
@double
|
107
|
+
Spy.on(@double, :something).and_raise(RuntimeError.new("error message"))
|
240
108
|
expect { @double.something }.to raise_error(RuntimeError, "error message")
|
241
109
|
end
|
242
110
|
|
@@ -249,7 +117,7 @@ module Spy
|
|
249
117
|
end
|
250
118
|
|
251
119
|
it "raises a given instance of an exception with arguments other than the standard 'message'" do
|
252
|
-
@double
|
120
|
+
Spy.on(@double, :something).and_raise(OutOfGas.new(2, :oz))
|
253
121
|
|
254
122
|
begin
|
255
123
|
@double.something
|
@@ -260,172 +128,22 @@ module Spy
|
|
260
128
|
end
|
261
129
|
end
|
262
130
|
|
263
|
-
it "does not raise when told to if args dont match" do
|
264
|
-
@double.should_receive(:something).with(2).and_raise(RuntimeError)
|
265
|
-
expect {
|
266
|
-
@double.something 1
|
267
|
-
}.to raise_error(RSpec::Mocks::MockExpectationError)
|
268
|
-
end
|
269
|
-
|
270
131
|
it "throws when told to" do
|
271
|
-
@double
|
132
|
+
Spy.on(@double, :something).and_throw(:blech)
|
272
133
|
expect {
|
273
134
|
@double.something
|
274
135
|
}.to throw_symbol(:blech)
|
275
136
|
end
|
276
137
|
|
277
|
-
it "ignores args on any args" do
|
278
|
-
@double.should_receive(:something).at_least(:once).with(any_args)
|
279
|
-
@double.something
|
280
|
-
@double.something 1
|
281
|
-
@double.something "a", 2
|
282
|
-
@double.something [], {}, "joe", 7
|
283
|
-
@double.rspec_verify
|
284
|
-
end
|
285
|
-
|
286
|
-
it "fails on no args if any args received" do
|
287
|
-
@double.should_receive(:something).with(no_args())
|
288
|
-
expect {
|
289
|
-
@double.something 1
|
290
|
-
}.to raise_error(RSpec::Mocks::MockExpectationError, "Double \"test double\" received :something with unexpected arguments\n expected: (no args)\n got: (1)")
|
291
|
-
end
|
292
|
-
|
293
|
-
it "fails when args are expected but none are received" do
|
294
|
-
@double.should_receive(:something).with(1)
|
295
|
-
expect {
|
296
|
-
@double.something
|
297
|
-
}.to raise_error(RSpec::Mocks::MockExpectationError, "Double \"test double\" received :something with unexpected arguments\n expected: (1)\n got: (no args)")
|
298
|
-
end
|
299
|
-
|
300
138
|
it "returns value from block by default" do
|
301
|
-
Spy.on(@double, :method_that_yields).and_yield
|
139
|
+
spy = Spy.on(@double, :method_that_yields).and_yield
|
302
140
|
value = @double.method_that_yields { :returned_obj }
|
303
141
|
expect(value).to eq :returned_obj
|
304
|
-
|
305
|
-
end
|
306
|
-
|
307
|
-
it "yields 0 args to blocks that take a variable number of arguments" do
|
308
|
-
@double.should_receive(:yield_back).with(no_args()).once.and_yield
|
309
|
-
a = nil
|
310
|
-
@double.yield_back {|*x| a = x}
|
311
|
-
expect(a).to eq []
|
312
|
-
@double.rspec_verify
|
313
|
-
end
|
314
|
-
|
315
|
-
it "yields 0 args multiple times to blocks that take a variable number of arguments" do
|
316
|
-
@double.should_receive(:yield_back).once.with(no_args()).once.and_yield.
|
317
|
-
and_yield
|
318
|
-
b = []
|
319
|
-
@double.yield_back {|*a| b << a}
|
320
|
-
expect(b).to eq [ [], [] ]
|
321
|
-
@double.rspec_verify
|
322
|
-
end
|
323
|
-
|
324
|
-
it "yields one arg to blocks that take a variable number of arguments" do
|
325
|
-
@double.should_receive(:yield_back).with(no_args()).once.and_yield(99)
|
326
|
-
a = nil
|
327
|
-
@double.yield_back {|*x| a = x}
|
328
|
-
expect(a).to eq [99]
|
329
|
-
@double.rspec_verify
|
330
|
-
end
|
331
|
-
|
332
|
-
it "yields one arg 3 times consecutively to blocks that take a variable number of arguments" do
|
333
|
-
@double.should_receive(:yield_back).once.with(no_args()).once.and_yield(99).
|
334
|
-
and_yield(43).
|
335
|
-
and_yield("something fruity")
|
336
|
-
b = []
|
337
|
-
@double.yield_back {|*a| b << a}
|
338
|
-
expect(b).to eq [[99], [43], ["something fruity"]]
|
339
|
-
@double.rspec_verify
|
340
|
-
end
|
341
|
-
|
342
|
-
it "yields many args to blocks that take a variable number of arguments" do
|
343
|
-
@double.should_receive(:yield_back).with(no_args()).once.and_yield(99, 27, "go")
|
344
|
-
a = nil
|
345
|
-
@double.yield_back {|*x| a = x}
|
346
|
-
expect(a).to eq [99, 27, "go"]
|
347
|
-
@double.rspec_verify
|
348
|
-
end
|
349
|
-
|
350
|
-
it "yields many args 3 times consecutively to blocks that take a variable number of arguments" do
|
351
|
-
@double.should_receive(:yield_back).once.with(no_args()).once.and_yield(99, :green, "go").
|
352
|
-
and_yield("wait", :amber).
|
353
|
-
and_yield("stop", 12, :red)
|
354
|
-
b = []
|
355
|
-
@double.yield_back {|*a| b << a}
|
356
|
-
expect(b).to eq [[99, :green, "go"], ["wait", :amber], ["stop", 12, :red]]
|
357
|
-
@double.rspec_verify
|
358
|
-
end
|
359
|
-
|
360
|
-
it "yields single value" do
|
361
|
-
@double.should_receive(:yield_back).with(no_args()).once.and_yield(99)
|
362
|
-
a = nil
|
363
|
-
@double.yield_back {|x| a = x}
|
364
|
-
expect(a).to eq 99
|
365
|
-
@double.rspec_verify
|
366
|
-
end
|
367
|
-
|
368
|
-
it "yields single value 3 times consecutively" do
|
369
|
-
@double.should_receive(:yield_back).once.with(no_args()).once.and_yield(99).
|
370
|
-
and_yield(43).
|
371
|
-
and_yield("something fruity")
|
372
|
-
b = []
|
373
|
-
@double.yield_back {|a| b << a}
|
374
|
-
expect(b).to eq [99, 43, "something fruity"]
|
375
|
-
@double.rspec_verify
|
376
|
-
end
|
377
|
-
|
378
|
-
it "yields two values" do
|
379
|
-
@double.should_receive(:yield_back).with(no_args()).once.and_yield('wha', 'zup')
|
380
|
-
a, b = nil
|
381
|
-
@double.yield_back {|x,y| a=x; b=y}
|
382
|
-
expect(a).to eq 'wha'
|
383
|
-
expect(b).to eq 'zup'
|
384
|
-
@double.rspec_verify
|
385
|
-
end
|
386
|
-
|
387
|
-
it "yields two values 3 times consecutively" do
|
388
|
-
@double.should_receive(:yield_back).once.with(no_args()).once.and_yield('wha', 'zup').
|
389
|
-
and_yield('not', 'down').
|
390
|
-
and_yield(14, 65)
|
391
|
-
c = []
|
392
|
-
@double.yield_back {|a,b| c << [a, b]}
|
393
|
-
expect(c).to eq [['wha', 'zup'], ['not', 'down'], [14, 65]]
|
394
|
-
@double.rspec_verify
|
395
|
-
end
|
396
|
-
|
397
|
-
it "fails when calling yielding method with wrong arity" do
|
398
|
-
@double.should_receive(:yield_back).with(no_args()).once.and_yield('wha', 'zup')
|
399
|
-
expect {
|
400
|
-
@double.yield_back {|a|}
|
401
|
-
}.to raise_error(RSpec::Mocks::MockExpectationError, "Double \"test double\" yielded |\"wha\", \"zup\"| to block with arity of 1")
|
402
|
-
end
|
403
|
-
|
404
|
-
it "fails when calling yielding method consecutively with wrong arity" do
|
405
|
-
@double.should_receive(:yield_back).once.with(no_args()).once.and_yield('wha', 'zup').
|
406
|
-
and_yield('down').
|
407
|
-
and_yield(14, 65)
|
408
|
-
expect {
|
409
|
-
c = []
|
410
|
-
@double.yield_back {|a,b| c << [a, b]}
|
411
|
-
}.to raise_error(RSpec::Mocks::MockExpectationError, "Double \"test double\" yielded |\"down\"| to block with arity of 2")
|
412
|
-
end
|
413
|
-
|
414
|
-
it "fails when calling yielding method without block" do
|
415
|
-
@double.should_receive(:yield_back).with(no_args()).once.and_yield('wha', 'zup')
|
416
|
-
expect {
|
417
|
-
@double.yield_back
|
418
|
-
}.to raise_error(RSpec::Mocks::MockExpectationError, "Double \"test double\" asked to yield |[\"wha\", \"zup\"]| but no block was passed")
|
419
|
-
end
|
420
|
-
|
421
|
-
it "is able to double send" do
|
422
|
-
@double.should_receive(:send).with(any_args)
|
423
|
-
@double.send 'hi'
|
424
|
-
@double.rspec_verify
|
142
|
+
expect(spy).to have_been_called
|
425
143
|
end
|
426
144
|
|
427
145
|
it "is able to raise from method calling yielding double" do
|
428
|
-
@double
|
146
|
+
spy = Spy.on(@double, :yield_me).and_yield 44
|
429
147
|
|
430
148
|
expect {
|
431
149
|
@double.yield_me do |x|
|
@@ -433,118 +151,7 @@ module Spy
|
|
433
151
|
end
|
434
152
|
}.to raise_error(StandardError, "Bang")
|
435
153
|
|
436
|
-
|
437
|
-
end
|
438
|
-
|
439
|
-
it "clears expectations after verify" do
|
440
|
-
@double.should_receive(:foobar)
|
441
|
-
@double.foobar
|
442
|
-
@double.rspec_verify
|
443
|
-
expect {
|
444
|
-
@double.foobar
|
445
|
-
}.to raise_error(RSpec::Mocks::MockExpectationError, %q|Double "test double" received unexpected message :foobar with (no args)|)
|
446
|
-
end
|
447
|
-
|
448
|
-
it "restores objects to their original state on rspec_reset" do
|
449
|
-
double = double("this is a double")
|
450
|
-
double.should_receive(:blah)
|
451
|
-
double.rspec_reset
|
452
|
-
double.rspec_verify #should throw if reset didn't work
|
453
|
-
end
|
454
|
-
|
455
|
-
it "works even after method_missing starts raising NameErrors instead of NoMethodErrors" do
|
456
|
-
# Object#method_missing throws either NameErrors or NoMethodErrors.
|
457
|
-
#
|
458
|
-
# On a fresh ruby program Object#method_missing:
|
459
|
-
# * raises a NoMethodError when called directly
|
460
|
-
# * raises a NameError when called indirectly
|
461
|
-
#
|
462
|
-
# Once Object#method_missing has been called at least once (on any object)
|
463
|
-
# it starts behaving differently:
|
464
|
-
# * raises a NameError when called directly
|
465
|
-
# * raises a NameError when called indirectly
|
466
|
-
#
|
467
|
-
# There was a bug in Mock#method_missing that relied on the fact
|
468
|
-
# that calling Object#method_missing directly raises a NoMethodError.
|
469
|
-
# This example tests that the bug doesn't exist anymore.
|
470
|
-
|
471
|
-
|
472
|
-
# Ensures that method_missing always raises NameErrors.
|
473
|
-
a_method_that_doesnt_exist rescue
|
474
|
-
|
475
|
-
|
476
|
-
@double.should_receive(:foobar)
|
477
|
-
@double.foobar
|
478
|
-
@double.rspec_verify
|
479
|
-
|
480
|
-
expect { @double.foobar }.to_not raise_error(NameError)
|
481
|
-
expect { @double.foobar }.to raise_error(RSpec::Mocks::MockExpectationError)
|
482
|
-
end
|
483
|
-
|
484
|
-
it "temporarily replaces a method stub on a double" do
|
485
|
-
Spy.on(@double, :msg).and_return(:stub_value)
|
486
|
-
@double.should_receive(:msg).with(:arg).and_return(:double_value)
|
487
|
-
expect(@double.msg(:arg)).to equal(:double_value)
|
488
|
-
expect(@double.msg).to equal(:stub_value)
|
489
|
-
expect(@double.msg).to equal(:stub_value)
|
490
|
-
@double.rspec_verify
|
491
|
-
end
|
492
|
-
|
493
|
-
it "does not require a different signature to replace a method stub" do
|
494
|
-
Spy.on(@double, :msg).and_return(:stub_value)
|
495
|
-
@double.should_receive(:msg).and_return(:double_value)
|
496
|
-
expect(@double.msg(:arg)).to equal(:double_value)
|
497
|
-
expect(@double.msg).to equal(:stub_value)
|
498
|
-
expect(@double.msg).to equal(:stub_value)
|
499
|
-
@double.rspec_verify
|
500
|
-
end
|
501
|
-
|
502
|
-
it "raises an error when a previously stubbed method has a negative expectation" do
|
503
|
-
Spy.on(@double, :msg).and_return(:stub_value)
|
504
|
-
@double.should_not_receive(:msg)
|
505
|
-
expect { @double.msg(:arg) }.to raise_error(RSpec::Mocks::MockExpectationError)
|
506
|
-
end
|
507
|
-
|
508
|
-
it "temporarily replaces a method stub on a non-double" do
|
509
|
-
non_double = Object.new
|
510
|
-
Spy.on(non_double, :msg).and_return(:stub_value)
|
511
|
-
non_double.should_receive(:msg).with(:arg).and_return(:double_value)
|
512
|
-
expect(non_double.msg(:arg)).to equal(:double_value)
|
513
|
-
expect(non_double.msg).to equal(:stub_value)
|
514
|
-
expect(non_double.msg).to equal(:stub_value)
|
515
|
-
non_double.rspec_verify
|
516
|
-
end
|
517
|
-
|
518
|
-
it "returns the stubbed value when no new value specified" do
|
519
|
-
Spy.on(@double, :msg).and_return(:stub_value)
|
520
|
-
@double.should_receive(:msg)
|
521
|
-
expect(@double.msg).to equal(:stub_value)
|
522
|
-
@double.rspec_verify
|
523
|
-
end
|
524
|
-
|
525
|
-
it "returns the stubbed value when stubbed with args and no new value specified" do
|
526
|
-
Spy.on(@double, :msg).with(:arg).and_return(:stub_value)
|
527
|
-
@double.should_receive(:msg).with(:arg)
|
528
|
-
expect(@double.msg(:arg)).to equal(:stub_value)
|
529
|
-
@double.rspec_verify
|
530
|
-
end
|
531
|
-
|
532
|
-
it "does not mess with the stub's yielded values when also doubleed" do
|
533
|
-
Spy.on(@double, :yield_back).and_yield(:stub_value)
|
534
|
-
@double.should_receive(:yield_back).and_yield(:double_value)
|
535
|
-
@double.yield_back{|v| expect(v).to eq :double_value }
|
536
|
-
@double.yield_back{|v| expect(v).to eq :stub_value }
|
537
|
-
@double.rspec_verify
|
538
|
-
end
|
539
|
-
|
540
|
-
it "yields multiple values after a similar stub" do
|
541
|
-
FSpy.on(ile, :open).and_yield(:stub_value)
|
542
|
-
File.should_receive(:open).and_yield(:first_call).and_yield(:second_call)
|
543
|
-
yielded_args = []
|
544
|
-
File.open {|v| yielded_args << v }
|
545
|
-
expect(yielded_args).to eq [:first_call, :second_call]
|
546
|
-
File.open {|v| expect(v).to eq :stub_value }
|
547
|
-
File.rspec_verify
|
154
|
+
expect(spy).to have_been_called
|
548
155
|
end
|
549
156
|
|
550
157
|
it "assigns stub return values" do
|
@@ -565,63 +172,12 @@ module Spy
|
|
565
172
|
end
|
566
173
|
|
567
174
|
it "calls the block after #should_receive" do
|
568
|
-
@double
|
175
|
+
spy = Spy.on(@double, :foo).and_return { add_call }
|
569
176
|
|
570
177
|
@double.foo
|
571
178
|
|
572
179
|
expect(@calls).to eq 1
|
573
|
-
|
574
|
-
|
575
|
-
it "calls the block after #should_receive after a similar stub" do
|
576
|
-
Spy.on(@double, :foo).and_return(:bar)
|
577
|
-
@double.should_receive(:foo) { add_call }
|
578
|
-
|
579
|
-
@double.foo
|
580
|
-
|
581
|
-
expect(@calls).to eq 1
|
582
|
-
end
|
583
|
-
|
584
|
-
it "calls the block after #once" do
|
585
|
-
@double.should_receive(:foo).once { add_call }
|
586
|
-
|
587
|
-
@double.foo
|
588
|
-
|
589
|
-
expect(@calls).to eq 1
|
590
|
-
end
|
591
|
-
|
592
|
-
it "calls the block after #twice" do
|
593
|
-
@double.should_receive(:foo).twice { add_call }
|
594
|
-
|
595
|
-
@double.foo
|
596
|
-
@double.foo
|
597
|
-
|
598
|
-
expect(@calls).to eq 2
|
599
|
-
end
|
600
|
-
|
601
|
-
it "calls the block after #times" do
|
602
|
-
@double.should_receive(:foo).exactly(10).times { add_call }
|
603
|
-
|
604
|
-
(1..10).each { @double.foo }
|
605
|
-
|
606
|
-
expect(@calls).to eq 10
|
607
|
-
end
|
608
|
-
|
609
|
-
it "calls the block after #any_number_of_times" do
|
610
|
-
@double.should_receive(:foo).any_number_of_times { add_call }
|
611
|
-
|
612
|
-
(1..7).each { @double.foo }
|
613
|
-
|
614
|
-
expect(@calls).to eq 7
|
615
|
-
end
|
616
|
-
|
617
|
-
it "calls the block after #ordered" do
|
618
|
-
@double.should_receive(:foo).ordered { add_call }
|
619
|
-
@double.should_receive(:bar).ordered { add_call }
|
620
|
-
|
621
|
-
@double.foo
|
622
|
-
@double.bar
|
623
|
-
|
624
|
-
expect(@calls).to eq 2
|
180
|
+
expect(spy).to have_been_called
|
625
181
|
end
|
626
182
|
end
|
627
183
|
|
@@ -647,7 +203,7 @@ module Spy
|
|
647
203
|
end
|
648
204
|
|
649
205
|
it "does respond to initially stubbed methods" do
|
650
|
-
double = Spy.double(:foo => "woo", :bar => "car")
|
206
|
+
double = Spy.double("name", :foo => "woo", :bar => "car")
|
651
207
|
expect(double.foo).to eq "woo"
|
652
208
|
expect(double.bar).to eq "car"
|
653
209
|
end
|
@@ -658,73 +214,9 @@ module Spy
|
|
658
214
|
first = Spy.double('first')
|
659
215
|
second = Spy.double('second')
|
660
216
|
|
661
|
-
|
217
|
+
spy = Spy.on(first, :==)
|
662
218
|
second == first
|
663
|
-
|
664
|
-
end
|
665
|
-
|
666
|
-
describe "with" do
|
667
|
-
before { @double = Spy.double('double') }
|
668
|
-
context "with args" do
|
669
|
-
context "with matching args" do
|
670
|
-
it "passes" do
|
671
|
-
@double.should_receive(:foo).with('bar')
|
672
|
-
@double.foo('bar')
|
673
|
-
end
|
674
|
-
end
|
675
|
-
|
676
|
-
context "with non-matching args" do
|
677
|
-
it "fails" do
|
678
|
-
@double.should_receive(:foo).with('bar')
|
679
|
-
expect do
|
680
|
-
@double.foo('baz')
|
681
|
-
end.to raise_error
|
682
|
-
@double.rspec_reset
|
683
|
-
end
|
684
|
-
end
|
685
|
-
|
686
|
-
context "with non-matching doubles" do
|
687
|
-
it "fails" do
|
688
|
-
d1 = Spy.double('1')
|
689
|
-
d2 = Spy.double('2')
|
690
|
-
@double.should_receive(:foo).with(d1)
|
691
|
-
expect do
|
692
|
-
@double.foo(d2)
|
693
|
-
end.to raise_error
|
694
|
-
@double.rspec_reset
|
695
|
-
end
|
696
|
-
end
|
697
|
-
|
698
|
-
context "with non-matching doubles as_null_object" do
|
699
|
-
it "fails" do
|
700
|
-
d1 = Spy.double('1').as_null_object
|
701
|
-
d2 = Spy.double('2').as_null_object
|
702
|
-
@double.should_receive(:foo).with(d1)
|
703
|
-
expect do
|
704
|
-
@double.foo(d2)
|
705
|
-
end.to raise_error
|
706
|
-
@double.rspec_reset
|
707
|
-
end
|
708
|
-
end
|
709
|
-
end
|
710
|
-
|
711
|
-
context "with a block" do
|
712
|
-
context "with matching args" do
|
713
|
-
it "returns the result of the block" do
|
714
|
-
@double.should_receive(:foo).with('bar') { 'baz' }
|
715
|
-
expect(@double.foo('bar')).to eq('baz')
|
716
|
-
end
|
717
|
-
end
|
718
|
-
|
719
|
-
context "with non-matching args" do
|
720
|
-
it "fails" do
|
721
|
-
@double.should_receive(:foo).with('bar') { 'baz' }
|
722
|
-
expect do
|
723
|
-
expect(@double.foo('wrong')).to eq('baz')
|
724
|
-
end.to raise_error(/received :foo with unexpected arguments/)
|
725
|
-
@double.rspec_reset
|
726
|
-
end
|
727
|
-
end
|
219
|
+
expect(spy.calls.first.args).to eq([second])
|
728
220
|
end
|
729
221
|
end
|
730
222
|
end
|