rspec-mocks 3.0.0.beta1 → 3.0.0.beta2
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.tar.gz.sig +1 -1
- data/Changelog.md +95 -3
- data/README.md +27 -13
- data/features/README.md +15 -7
- data/features/argument_matchers/README.md +5 -5
- data/features/argument_matchers/explicit.feature +6 -6
- data/features/argument_matchers/general_matchers.feature +4 -4
- data/features/argument_matchers/type_matchers.feature +2 -2
- data/features/message_expectations/README.md +29 -27
- data/features/message_expectations/call_original.feature +0 -1
- data/features/message_expectations/message_chains_using_expect.feature +49 -0
- data/features/method_stubs/README.md +2 -1
- data/features/method_stubs/{any_instance.feature → allow_any_instance_of.feature} +12 -12
- data/features/method_stubs/{stub_chain.feature → receive_message_chain.feature} +3 -3
- data/features/method_stubs/to_ary.feature +1 -1
- data/features/mutating_constants/stub_defined_constant.feature +0 -1
- data/features/outside_rspec/standalone.feature +1 -1
- data/features/spies/spy_pure_mock_method.feature +1 -1
- data/features/test_frameworks/test_unit.feature +21 -10
- data/features/verifying_doubles/README.md +17 -0
- data/features/verifying_doubles/class_doubles.feature +1 -16
- data/features/verifying_doubles/dynamic_classes.feature +0 -1
- data/features/verifying_doubles/{introduction.feature → instance_doubles.feature} +41 -23
- data/features/verifying_doubles/partial_doubles.feature +2 -2
- data/lib/rspec/mocks.rb +69 -82
- data/lib/rspec/mocks/any_instance/expect_chain_chain.rb +35 -0
- data/lib/rspec/mocks/any_instance/expectation_chain.rb +1 -2
- data/lib/rspec/mocks/any_instance/recorder.rb +52 -18
- data/lib/rspec/mocks/any_instance/stub_chain.rb +1 -1
- data/lib/rspec/mocks/any_instance/stub_chain_chain.rb +4 -0
- data/lib/rspec/mocks/argument_list_matcher.rb +10 -44
- data/lib/rspec/mocks/argument_matchers.rb +132 -163
- data/lib/rspec/mocks/configuration.rb +28 -4
- data/lib/rspec/mocks/error_generator.rb +46 -13
- data/lib/rspec/mocks/example_methods.rb +13 -12
- data/lib/rspec/mocks/extensions/marshal.rb +1 -1
- data/lib/rspec/mocks/framework.rb +3 -4
- data/lib/rspec/mocks/instance_method_stasher.rb +2 -3
- data/lib/rspec/mocks/matchers/have_received.rb +8 -6
- data/lib/rspec/mocks/matchers/receive.rb +28 -20
- data/lib/rspec/mocks/matchers/receive_message_chain.rb +65 -0
- data/lib/rspec/mocks/matchers/receive_messages.rb +3 -2
- data/lib/rspec/mocks/message_chain.rb +91 -0
- data/lib/rspec/mocks/message_expectation.rb +86 -80
- data/lib/rspec/mocks/method_double.rb +2 -11
- data/lib/rspec/mocks/method_reference.rb +82 -23
- data/lib/rspec/mocks/method_signature_verifier.rb +207 -0
- data/lib/rspec/mocks/mutate_const.rb +34 -50
- data/lib/rspec/mocks/object_reference.rb +0 -1
- data/lib/rspec/mocks/proxy.rb +70 -13
- data/lib/rspec/mocks/ruby_features.rb +24 -0
- data/lib/rspec/mocks/space.rb +105 -31
- data/lib/rspec/mocks/standalone.rb +2 -2
- data/lib/rspec/mocks/syntax.rb +43 -8
- data/lib/rspec/mocks/targets.rb +16 -7
- data/lib/rspec/mocks/test_double.rb +41 -15
- data/lib/rspec/mocks/verifying_double.rb +51 -4
- data/lib/rspec/mocks/verifying_message_expecation.rb +12 -12
- data/lib/rspec/mocks/verifying_proxy.rb +32 -19
- data/lib/rspec/mocks/version.rb +1 -1
- data/spec/rspec/mocks/and_call_original_spec.rb +28 -7
- data/spec/rspec/mocks/and_return_spec.rb +23 -0
- data/spec/rspec/mocks/and_yield_spec.rb +1 -2
- data/spec/rspec/mocks/any_instance_spec.rb +33 -17
- data/spec/rspec/mocks/array_including_matcher_spec.rb +6 -6
- data/spec/rspec/mocks/before_all_spec.rb +132 -0
- data/spec/rspec/mocks/block_return_value_spec.rb +12 -1
- data/spec/rspec/mocks/combining_implementation_instructions_spec.rb +9 -11
- data/spec/rspec/mocks/configuration_spec.rb +14 -1
- data/spec/rspec/mocks/double_spec.rb +867 -24
- data/spec/rspec/mocks/example_methods_spec.rb +13 -0
- data/spec/rspec/mocks/extensions/marshal_spec.rb +17 -17
- data/spec/rspec/mocks/failing_argument_matchers_spec.rb +29 -1
- data/spec/rspec/mocks/hash_excluding_matcher_spec.rb +12 -12
- data/spec/rspec/mocks/hash_including_matcher_spec.rb +21 -17
- data/spec/rspec/mocks/instance_method_stasher_spec.rb +2 -3
- data/spec/rspec/mocks/matchers/have_received_spec.rb +7 -0
- data/spec/rspec/mocks/matchers/receive_message_chain_spec.rb +198 -0
- data/spec/rspec/mocks/matchers/receive_messages_spec.rb +2 -2
- data/spec/rspec/mocks/matchers/receive_spec.rb +19 -6
- data/spec/rspec/mocks/method_signature_verifier_spec.rb +272 -0
- data/spec/rspec/mocks/methods_spec.rb +0 -1
- data/spec/rspec/mocks/multiple_return_value_spec.rb +2 -2
- data/spec/rspec/mocks/mutate_const_spec.rb +24 -1
- data/spec/rspec/mocks/nil_expectation_warning_spec.rb +6 -22
- data/spec/rspec/mocks/null_object_mock_spec.rb +13 -7
- data/spec/rspec/mocks/options_hash_spec.rb +3 -3
- data/spec/rspec/mocks/{partial_mock_spec.rb → partial_double_spec.rb} +5 -2
- data/spec/rspec/mocks/{partial_mock_using_mocks_directly_spec.rb → partial_double_using_mocks_directly_spec.rb} +1 -1
- data/spec/rspec/mocks/passing_argument_matchers_spec.rb +18 -0
- data/spec/rspec/mocks/serialization_spec.rb +1 -0
- data/spec/rspec/mocks/space_spec.rb +218 -7
- data/spec/rspec/mocks/stub_chain_spec.rb +6 -0
- data/spec/rspec/mocks/stub_spec.rb +0 -6
- data/spec/rspec/mocks/syntax_spec.rb +19 -0
- data/spec/rspec/mocks/test_double_spec.rb +0 -1
- data/spec/rspec/mocks/verifying_double_spec.rb +281 -18
- data/spec/rspec/mocks/verifying_message_expecation_spec.rb +7 -6
- data/spec/rspec/mocks_spec.rb +168 -42
- data/spec/spec_helper.rb +34 -22
- metadata +94 -63
- metadata.gz.sig +0 -0
- checksums.yaml +0 -15
- checksums.yaml.gz.sig +0 -2
- data/features/outside_rspec/configuration.feature +0 -60
- data/lib/rspec/mocks/arity_calculator.rb +0 -66
- data/lib/rspec/mocks/errors.rb +0 -12
- data/lib/rspec/mocks/mock.rb +0 -7
- data/lib/rspec/mocks/proxy_for_nil.rb +0 -37
- data/lib/rspec/mocks/stub_chain.rb +0 -51
- data/spec/rspec/mocks/argument_expectation_spec.rb +0 -32
- data/spec/rspec/mocks/arity_calculator_spec.rb +0 -95
- data/spec/rspec/mocks/mock_space_spec.rb +0 -113
- data/spec/rspec/mocks/mock_spec.rb +0 -788
data.tar.gz.sig
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
�Y;�Ԝ��q�(^g>��2�B�äh��'�G��~���C�7H��d�Cҷ���ΗS�ݛʭ�a����^E�+�P�\#]�=]�F�hI�x��4�s �
|
data/Changelog.md
CHANGED
@@ -1,3 +1,70 @@
|
|
1
|
+
### 3.0.0.beta2 / 2014-02-17
|
2
|
+
[full changelog](http://github.com/rspec/rspec-mocks/compare/v3.0.0.beta1...v3.0.0.beta2)
|
3
|
+
|
4
|
+
Breaking Changes for 3.0.0:
|
5
|
+
|
6
|
+
* Rename `RSpec::Mocks::Mock` to `RSpec::Mocks::Double`. (Myron Marston)
|
7
|
+
* Change how to integrate rspec-mocks in other test frameworks. You now
|
8
|
+
need to include `RSpec::Mocks::ExampleMethods` in your test context.
|
9
|
+
(Myron Marston)
|
10
|
+
* Prevent RSpec mocks' doubles and partial doubles from being used outside of
|
11
|
+
the per-test lifecycle (e.g. from a `before(:all)` hook). (Sam Phippen)
|
12
|
+
* Remove the `host` argument of `RSpec::Mocks.setup`. Instead
|
13
|
+
`RSpec::Mocks::ExampleMethods` should be included directly in the scope where
|
14
|
+
RSpec's mocking capabilities are used. (Sam Phippen)
|
15
|
+
* Make test doubles raise errors if you attempt to use them after they
|
16
|
+
get reset, to help surface issues when you accidentally retain
|
17
|
+
references to test doubles and attempt to reuse them in another
|
18
|
+
example. (Myron Marston)
|
19
|
+
* Remove support for `and_return { value }` and `and_return` without arguments. (Yuji Nakayama)
|
20
|
+
|
21
|
+
Enhancements:
|
22
|
+
|
23
|
+
* Add `receive_message_chain` which provides the functionality of the old
|
24
|
+
`stub_chain` for the new allow/expect syntax. Use it like so: `allow(...).to
|
25
|
+
receive_message_chain(:foo, :bar, :bazz)`. (Sam Phippen).
|
26
|
+
* Change argument matchers to use `===` as their primary matching
|
27
|
+
protocol, since their semantics mirror that of a case or rescue statement
|
28
|
+
(which uses `===` for matching). (Myron Marston)
|
29
|
+
* Add `RSpec::Mocks.with_temporary_scope`, which allows you to create
|
30
|
+
temporary rspec-mocks scopes in arbitrary places (such as a
|
31
|
+
`before(:all)` hook). (Myron Marston)
|
32
|
+
* Support keyword arguments when checking arity with verifying doubles.
|
33
|
+
(Xavier Shay)
|
34
|
+
|
35
|
+
Bug Fixes:
|
36
|
+
|
37
|
+
* Fix regression in 3.0.0.beta1 that caused `double("string_name" => :value)`
|
38
|
+
to stop working. (Xavier Shay)
|
39
|
+
* Fix the way rspec-mocks and rspec-core interact so that if users
|
40
|
+
define a `let` with the same name as one of the methods
|
41
|
+
from `RSpec::Mocks::ArgumentMatchers`, the user's `let` takes
|
42
|
+
precedence. (Michi Huber, Myron Marston)
|
43
|
+
* Fix verified doubles so that their methods match the visibility
|
44
|
+
(public, protected or private) of the interface they verify
|
45
|
+
against. (Myron Marston)
|
46
|
+
* Fix verified null object doubles so that they do not wrongly
|
47
|
+
report that they respond to anything. They only respond to methods
|
48
|
+
available on the interface they verify against. (Myron Marston)
|
49
|
+
* Fix deprecation warning for use of old `:should` syntax w/o explicit
|
50
|
+
config so that it no longer is silenced by an extension gem such
|
51
|
+
as rspec-rails when it calls `config.add_stub_and_should_receive_to`.
|
52
|
+
(Sam Phippen)
|
53
|
+
* Fix `expect` syntax so that it does not wrongly emit a "You're
|
54
|
+
overriding a previous implementation for this stub" warning when
|
55
|
+
you are not actually doing that. (Myron Marston)
|
56
|
+
* Fix `any_instance.unstub` when used on sub classes for whom the super
|
57
|
+
class has had `any_instance.stub` invoked on. (Jon Rowe)
|
58
|
+
* Fix regression in `stub_chain`/`receive_message_chain` that caused
|
59
|
+
it to raise an `ArgumentError` when passing args to the stubbed
|
60
|
+
methods. (Sam Phippen)
|
61
|
+
* Correct stub of undefined parent modules all the way down when stubbing a
|
62
|
+
nested constant. (Xavier Shay)
|
63
|
+
* Raise `VerifyingDoubleNotDefinedError` when a constant is not defined for
|
64
|
+
a verifying class double. (Maurício Linhares)
|
65
|
+
* Remove `Double#to_str`, which caused confusing `raise some_double`
|
66
|
+
behavior. (Maurício Linhares)
|
67
|
+
|
1
68
|
### 3.0.0.beta1 / 2013-11-07
|
2
69
|
[full changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.0.beta1...v3.0.0.beta1)
|
3
70
|
|
@@ -31,8 +98,8 @@ Enhancements:
|
|
31
98
|
(Xavier Shay)
|
32
99
|
* Provide `object_double` to create verified doubles of specific object
|
33
100
|
instances. (Xavier Shay)
|
34
|
-
* Provide
|
35
|
-
like verification behaviour on partial
|
101
|
+
* Provide `verify_partial_doubles` configuration that provides `object_double`
|
102
|
+
like verification behaviour on partial doubles. (Xavier Shay)
|
36
103
|
* Improved performance of double creation, particularly those with many
|
37
104
|
attributes. (Xavier Shay)
|
38
105
|
* Default value of `transfer_nested_constants` option for constant stubbing can
|
@@ -50,7 +117,7 @@ Enhancements:
|
|
50
117
|
Deprecations:
|
51
118
|
|
52
119
|
* Using the old `:should` syntax without explicitly configuring it
|
53
|
-
is
|
120
|
+
is deprecated. It will continue to work but will emit a deprecation
|
54
121
|
warning in RSpec 3 if you do not explicitly enable it. (Sam Phippen)
|
55
122
|
|
56
123
|
Bug Fixes:
|
@@ -62,6 +129,21 @@ Bug Fixes:
|
|
62
129
|
returns `nil` or `''` so that you still get a useful message.
|
63
130
|
(Nick DeLuca)
|
64
131
|
|
132
|
+
### 2.99.0.beta2 / 2014-02-17
|
133
|
+
[full changelog](http://github.com/rspec/rspec-mocks/compare/v2.99.0.beta1...v2.99.0.beta2)
|
134
|
+
|
135
|
+
Deprecations:
|
136
|
+
|
137
|
+
* Deprecate `RSpec::Mocks::Mock` in favor of `RSpec::Mocks::Double`.
|
138
|
+
(Myron Marston)
|
139
|
+
* Deprecate the `host` argument of `RSpec::Mocks.setup`. Instead
|
140
|
+
`RSpec::Mocks::ExampleMethods` should be included directly in the scope where
|
141
|
+
RSpec's mocking capabilities are used. (Sam Phippen)
|
142
|
+
* Deprecate using any of rspec-mocks' features outside the per-test
|
143
|
+
lifecycle (e.g. from a `before(:all)` hook). (Myron Marston)
|
144
|
+
* Deprecate re-using a test double in another example. (Myron Marston)
|
145
|
+
* Deprecate `and_return { value }` and `and_return` without arguments. (Yuji Nakayama)
|
146
|
+
|
65
147
|
### 2.99.0.beta1 / 2013-11-07
|
66
148
|
[full changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.4...v2.99.0.beta1)
|
67
149
|
|
@@ -87,6 +169,16 @@ Enhancements:
|
|
87
169
|
* Add a config option to yield the receiver to `any_instance` implementation
|
88
170
|
blocks. (Sam Phippen)
|
89
171
|
|
172
|
+
### 2.14.5 / 2014-02-01
|
173
|
+
[full changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.4...v2.14.5)
|
174
|
+
|
175
|
+
Bug Fixes:
|
176
|
+
|
177
|
+
* Fix regression that caused block implementations to not receive all
|
178
|
+
args on 1.8.7 if the block also receives a block, due to Proc#arity
|
179
|
+
reporting `1` no matter how many args the block receives if it
|
180
|
+
receives a block, too. (Myron Marston)
|
181
|
+
|
90
182
|
### 2.14.4 / 2013-10-15
|
91
183
|
[full changelog](http://github.com/rspec/rspec-mocks/compare/v2.14.3...v2.14.4)
|
92
184
|
|
data/README.md
CHANGED
@@ -11,14 +11,28 @@ alike.
|
|
11
11
|
|
12
12
|
## Test Doubles
|
13
13
|
|
14
|
-
A
|
15
|
-
|
16
|
-
expectations.
|
14
|
+
A test double is an object that stands in for another object in your system
|
15
|
+
during a code example. Use the `double` method, passing in an optional identifier, to create one:
|
17
16
|
|
18
17
|
```ruby
|
19
18
|
book = double("book")
|
20
19
|
```
|
21
20
|
|
21
|
+
Most of the time you will want some confidence that your doubles resemble an
|
22
|
+
existing object in your system. Verifying doubles are provided for this
|
23
|
+
purpose. If the existing object is available, they will prevent you from adding
|
24
|
+
stubs and expectations for methods that do not exist or that have an invalid
|
25
|
+
number of parameters.
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
book = instance_double("Book", :pages => 250)
|
29
|
+
```
|
30
|
+
|
31
|
+
Verifying doubles have some clever tricks to enable you to both test in
|
32
|
+
isolation without your dependencies loaded while still being able to validate
|
33
|
+
them against real objects. More detail is available in [their
|
34
|
+
documentation](https://github.com/rspec/rspec-mocks/blob/master/features/verifying_doubles).
|
35
|
+
|
22
36
|
## Method Stubs
|
23
37
|
|
24
38
|
A method stub is an implementation that returns a pre-determined value. Method
|
@@ -49,7 +63,7 @@ This is particularly nice when providing a list of test doubles to a method
|
|
49
63
|
that iterates through them:
|
50
64
|
|
51
65
|
```ruby
|
52
|
-
order.calculate_total_price(double(:price => 1.99),double(:price => 2.99))
|
66
|
+
order.calculate_total_price(double(:price => 1.99), double(:price => 2.99))
|
53
67
|
```
|
54
68
|
|
55
69
|
## Consecutive return values
|
@@ -59,7 +73,7 @@ arguments to `and_return`. The invocations cycle through the list. The last
|
|
59
73
|
value is returned for any subsequent invocations:
|
60
74
|
|
61
75
|
```ruby
|
62
|
-
allow(die).to receive(:roll).and_return(1,2,3)
|
76
|
+
allow(die).to receive(:roll).and_return(1, 2, 3)
|
63
77
|
die.roll # => 1
|
64
78
|
die.roll # => 2
|
65
79
|
die.roll # => 3
|
@@ -125,7 +139,7 @@ generic kind of object: a Test Double.
|
|
125
139
|
|
126
140
|
### Test-Specific Extension
|
127
141
|
|
128
|
-
a.k.a. Partial
|
142
|
+
a.k.a. Partial Double, a Test-Specific Extension is an extension of a
|
129
143
|
real object in a system that is instrumented with test-double like
|
130
144
|
behaviour in the context of a test. This technique is very common in Ruby
|
131
145
|
because we often see class objects acting as global namespaces for methods.
|
@@ -206,7 +220,7 @@ expect(double).to receive(:msg).any_number_of_times
|
|
206
220
|
```ruby
|
207
221
|
expect(double).to receive(:msg).ordered
|
208
222
|
expect(double).to receive(:other_msg).ordered
|
209
|
-
#This will fail if the messages are received out of order
|
223
|
+
# This will fail if the messages are received out of order
|
210
224
|
```
|
211
225
|
|
212
226
|
This can include the same message with different arguments:
|
@@ -234,11 +248,11 @@ expect(double).to receive(:msg).and_return(value)
|
|
234
248
|
expect(double).to receive(:msg).exactly(3).times.and_return(value1, value2, value3)
|
235
249
|
# returns value1 the first time, value2 the second, etc
|
236
250
|
expect(double).to receive(:msg).and_raise(error)
|
237
|
-
#error can be an instantiated object or a class
|
238
|
-
#if it is a class, it must be instantiable with no args
|
251
|
+
# error can be an instantiated object or a class
|
252
|
+
# if it is a class, it must be instantiable with no args
|
239
253
|
expect(double).to receive(:msg).and_throw(:msg)
|
240
|
-
expect(double).to receive(:msg).and_yield(values,to,yield)
|
241
|
-
expect(double).to receive(:msg).and_yield(values,to,yield).and_yield(some,other,values,this,time)
|
254
|
+
expect(double).to receive(:msg).and_yield(values, to, yield)
|
255
|
+
expect(double).to receive(:msg).and_yield(values, to, yield).and_yield(some, other, values, this, time)
|
242
256
|
# for methods that yield to a block multiple times
|
243
257
|
```
|
244
258
|
|
@@ -249,8 +263,8 @@ allow(double).to receive(:msg).and_return(value)
|
|
249
263
|
allow(double).to receive(:msg).and_return(value1, value2, value3)
|
250
264
|
allow(double).to receive(:msg).and_raise(error)
|
251
265
|
allow(double).to receive(:msg).and_throw(:msg)
|
252
|
-
allow(double).to receive(:msg).and_yield(values,to,yield)
|
253
|
-
allow(double).to receive(:msg).and_yield(values,to,yield).and_yield(some,other,values,this,time)
|
266
|
+
allow(double).to receive(:msg).and_yield(values, to, yield)
|
267
|
+
allow(double).to receive(:msg).and_yield(values, to, yield).and_yield(some, other, values, this, time)
|
254
268
|
```
|
255
269
|
|
256
270
|
## Arbitrary Handling
|
data/features/README.md
CHANGED
@@ -15,20 +15,28 @@ invokes a _method_ with the same name as the message.
|
|
15
15
|
## Test Doubles
|
16
16
|
|
17
17
|
A test double is an object that stands in for another object in your system
|
18
|
-
during a code example. Use the `double` method to create one:
|
18
|
+
during a code example. Use the `double` method, passing in an optional identifier, to create one:
|
19
19
|
|
20
|
-
|
20
|
+
book = double("book")
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
Most of the time you will want some confidence that your doubles resemble an
|
23
|
+
existing object in your system. Verifying doubles are provided for this
|
24
|
+
purpose. If the existing object is available, they will prevent you from adding
|
25
|
+
stubs and expectations for methods that do not exist or that have an invalid
|
26
|
+
number of parameters.
|
27
|
+
|
28
|
+
book = instance_double("Book", :pages => 250)
|
29
|
+
|
30
|
+
Verifying doubles have some clever tricks to enable you to both test in
|
31
|
+
isolation without your dependencies loaded while still being able to validate
|
32
|
+
them against real objects.
|
25
33
|
|
26
34
|
## Method Stubs
|
27
35
|
|
28
36
|
A method stub is an instruction to an object (real or test double) to return a
|
29
37
|
known value in response to a message:
|
30
38
|
|
31
|
-
die.
|
39
|
+
allow(die).to receive(:roll) { 3 }
|
32
40
|
|
33
41
|
This tells the `die` object to return the value `3` when it receives the `roll`
|
34
42
|
message.
|
@@ -45,7 +53,7 @@ specific message during the course of a code example:
|
|
45
53
|
account = Account.new
|
46
54
|
account.logger = logger
|
47
55
|
|
48
|
-
logger.
|
56
|
+
expect(logger).to receive(:account_closed).with(account)
|
49
57
|
|
50
58
|
account.close
|
51
59
|
end
|
@@ -4,10 +4,10 @@ Argument matchers can be used:
|
|
4
4
|
|
5
5
|
* In stubs to constrain the scope of the stubbed method
|
6
6
|
|
7
|
-
obj.
|
7
|
+
allow(obj).to receive(:foo).with(:bar) do |arg|
|
8
8
|
#do something for :bar
|
9
9
|
end
|
10
|
-
obj.
|
10
|
+
allow(obj).to receive(:foo).with(:baz) do |arg|
|
11
11
|
#do something for :baz
|
12
12
|
end
|
13
13
|
|
@@ -17,11 +17,11 @@ Argument matchers can be used:
|
|
17
17
|
obj = double()
|
18
18
|
|
19
19
|
#expect a message with given args
|
20
|
-
obj.
|
20
|
+
expect(obj).to receive(:message).with('an argument')
|
21
21
|
|
22
22
|
If more control is needed, one can use a block
|
23
23
|
|
24
|
-
obj.
|
24
|
+
expect(obj).to receive(:message) do |arg1, arg2|
|
25
25
|
# set expectations about the args in this block
|
26
26
|
# and optionally set a return value
|
27
|
-
end
|
27
|
+
end
|
@@ -8,15 +8,15 @@ Feature: explicit arguments
|
|
8
8
|
describe "stubbed explicit arguments" do
|
9
9
|
it "works on stubs" do
|
10
10
|
object = Object.new
|
11
|
-
object.
|
11
|
+
allow(object).to receive(:foo).with(:this) do |arg|
|
12
12
|
"got this"
|
13
13
|
end
|
14
|
-
object.
|
14
|
+
allow(object).to receive(:foo).with(:that) do |arg|
|
15
15
|
"got that"
|
16
16
|
end
|
17
17
|
|
18
|
-
object.foo(:this).
|
19
|
-
object.foo(:that).
|
18
|
+
expect(object.foo(:this)).to eq("got this")
|
19
|
+
expect(object.foo(:that)).to eq("got that")
|
20
20
|
end
|
21
21
|
|
22
22
|
it "works on doubles and expectations" do
|
@@ -36,10 +36,10 @@ Feature: explicit arguments
|
|
36
36
|
describe "stubbed multiple explicit arguments" do
|
37
37
|
it "works on stubs" do
|
38
38
|
object = Object.new
|
39
|
-
object.
|
39
|
+
allow(object).to receive(:foo).with(:this) do |arg|
|
40
40
|
"got this"
|
41
41
|
end
|
42
|
-
object.
|
42
|
+
allow(object).to receive(:foo).with(:this, :that) do |arg1, arg2|
|
43
43
|
"got this and that"
|
44
44
|
end
|
45
45
|
|
@@ -11,7 +11,7 @@ Feature: General matchers
|
|
11
11
|
describe "stubbed anything() args spec" do
|
12
12
|
it "works" do
|
13
13
|
object = Object.new
|
14
|
-
object.
|
14
|
+
allow(object).to receive(:foo).with(anything) do
|
15
15
|
"anything"
|
16
16
|
end
|
17
17
|
|
@@ -29,7 +29,7 @@ Feature: General matchers
|
|
29
29
|
describe "stubbed any_args() args spec" do
|
30
30
|
it "works" do
|
31
31
|
object = Object.new
|
32
|
-
object.
|
32
|
+
allow(object).to receive(:foo).with(any_args) do
|
33
33
|
"anything"
|
34
34
|
end
|
35
35
|
|
@@ -48,10 +48,10 @@ Feature: General matchers
|
|
48
48
|
describe "stubbed no_args() args spec" do
|
49
49
|
it "works for no args" do
|
50
50
|
object = Object.new
|
51
|
-
object.
|
51
|
+
allow(object).to receive(:foo).with(no_args) do
|
52
52
|
"nothing"
|
53
53
|
end
|
54
|
-
object.
|
54
|
+
allow(object).to receive(:foo).with(anything) do
|
55
55
|
"something"
|
56
56
|
end
|
57
57
|
|
@@ -10,10 +10,10 @@ Feature: stub with argument constraints
|
|
10
10
|
describe "stubbed an_instance_of() args spec" do
|
11
11
|
it "works" do
|
12
12
|
object = Object.new
|
13
|
-
object.
|
13
|
+
allow(object).to receive(:foo).with(an_instance_of(Symbol)) do
|
14
14
|
"symbol"
|
15
15
|
end
|
16
|
-
object.
|
16
|
+
allow(object).to receive(:foo).with(an_instance_of(String)) do
|
17
17
|
"string"
|
18
18
|
end
|
19
19
|
|
@@ -4,12 +4,14 @@
|
|
4
4
|
obj = double()
|
5
5
|
|
6
6
|
# expect a message
|
7
|
-
obj.
|
7
|
+
expect(obj).to receive(:message)
|
8
8
|
|
9
9
|
# specify a return value
|
10
|
-
obj.
|
11
|
-
obj.
|
12
|
-
|
10
|
+
expect(obj).to receive(:message) { :value }
|
11
|
+
expect(obj).to receive(:message).and_return(:value)
|
12
|
+
|
13
|
+
# specify multiple message/return value pairs
|
14
|
+
expect(obj).to receive_messages(:message => :value, :another_message => :another_value)
|
13
15
|
|
14
16
|
These forms are somewhat interchangeable. The difference is that the
|
15
17
|
block contents are evaluated lazily when the `obj` receives the
|
@@ -17,57 +19,57 @@ block contents are evaluated lazily when the `obj` receives the
|
|
17
19
|
|
18
20
|
### Fake implementation
|
19
21
|
|
20
|
-
obj.
|
22
|
+
expect(obj).to receive(:message) do |arg1, arg2|
|
21
23
|
# set expectations about the args in this block
|
22
24
|
# and set a return value
|
23
25
|
end
|
24
26
|
|
25
27
|
### Using the original implementation
|
26
28
|
|
27
|
-
obj.
|
29
|
+
expect(obj).to receive(:message).and_call_original
|
28
30
|
|
29
31
|
### Raising/Throwing
|
30
32
|
|
31
|
-
obj.
|
32
|
-
obj.
|
33
|
+
expect(obj).to receive(:message).and_raise("this error")
|
34
|
+
expect(obj).to receive(:message).and_throw(:this_symbol)
|
33
35
|
|
34
36
|
You can also use the block format:
|
35
37
|
|
36
|
-
obj.
|
37
|
-
obj.
|
38
|
+
expect(obj).to receive(:message) { raise "this error" }
|
39
|
+
expect(obj).to receive(:message) { throw :this_symbol }
|
38
40
|
|
39
41
|
### Argument constraints
|
40
42
|
|
41
43
|
#### Explicit arguments
|
42
44
|
|
43
|
-
obj.
|
44
|
-
obj.
|
45
|
+
expect(obj).to receive(:message).with('an argument')
|
46
|
+
expect(obj).to receive(:message).with('more_than', 'one_argument')
|
45
47
|
|
46
48
|
#### Argument matchers
|
47
49
|
|
48
|
-
obj.
|
49
|
-
obj.
|
50
|
-
obj.
|
50
|
+
expect(obj).to receive(:message).with(anything())
|
51
|
+
expect(obj).to receive(:message).with(an_instance_of(Money))
|
52
|
+
expect(obj).to receive(:message).with(hash_including(:a => 'b'))
|
51
53
|
|
52
54
|
#### Regular expressions
|
53
55
|
|
54
|
-
obj.
|
56
|
+
expect(obj).to receive(:message).with(/abc/)
|
55
57
|
|
56
58
|
### Counts
|
57
59
|
|
58
|
-
obj.
|
59
|
-
obj.
|
60
|
-
obj.
|
60
|
+
expect(obj).to receive(:message).once
|
61
|
+
expect(obj).to receive(:message).twice
|
62
|
+
expect(obj).to receive(:message).exactly(3).times
|
61
63
|
|
62
|
-
obj.
|
63
|
-
obj.
|
64
|
-
obj.
|
64
|
+
expect(obj).to receive(:message).at_least(:once)
|
65
|
+
expect(obj).to receive(:message).at_least(:twice)
|
66
|
+
expect(obj).to receive(:message).at_least(n).times
|
65
67
|
|
66
|
-
obj.
|
67
|
-
obj.
|
68
|
-
obj.
|
68
|
+
expect(obj).to receive(:message).at_most(:once)
|
69
|
+
expect(obj).to receive(:message).at_most(:twice)
|
70
|
+
expect(obj).to receive(:message).at_most(n).times
|
69
71
|
|
70
72
|
### Ordering
|
71
73
|
|
72
|
-
obj.
|
73
|
-
obj.
|
74
|
+
expect(obj).to receive(:one).ordered
|
75
|
+
expect(obj).to receive(:two).ordered
|