rspec-mocks 2.11.3 → 2.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Changelog.md +16 -0
- data/README.md +26 -1
- data/features/argument_matchers/explicit.feature +2 -2
- data/features/argument_matchers/general_matchers.feature +4 -4
- data/features/argument_matchers/type_matchers.feature +1 -1
- data/features/message_expectations/README.md +4 -0
- data/features/message_expectations/any_instance.feature +1 -1
- data/features/message_expectations/call_original.feature +24 -0
- data/features/message_expectations/expect_message.feature +5 -5
- data/features/message_expectations/receive_counts.feature +7 -7
- data/features/message_expectations/warn_when_expectation_is_set_on_nil.feature +3 -3
- data/features/method_stubs/any_instance.feature +6 -7
- data/features/method_stubs/as_null_object.feature +1 -1
- data/features/method_stubs/simple_return_value.feature +2 -2
- data/features/method_stubs/stub_chain.feature +1 -1
- data/features/method_stubs/stub_implementation.feature +1 -1
- data/features/method_stubs/to_ary.feature +1 -1
- data/features/{stubbing_constants → mutating_constants}/README.md +21 -1
- data/features/mutating_constants/hiding_defined_constant.feature +64 -0
- data/features/{stubbing_constants → mutating_constants}/stub_defined_constant.feature +0 -0
- data/features/{stubbing_constants → mutating_constants}/stub_undefined_constant.feature +0 -0
- data/features/outside_rspec/configuration.feature +3 -3
- data/features/outside_rspec/standalone.feature +6 -5
- data/lib/rspec/mocks.rb +17 -1
- data/lib/rspec/mocks/any_instance.rb +12 -12
- data/lib/rspec/mocks/configuration.rb +28 -0
- data/lib/rspec/mocks/error_generator.rb +6 -0
- data/lib/rspec/mocks/example_methods.rb +34 -9
- data/lib/rspec/mocks/framework.rb +3 -2
- data/lib/rspec/mocks/instance_method_stasher.rb +70 -0
- data/lib/rspec/mocks/message_expectation.rb +49 -29
- data/lib/rspec/mocks/method_double.rb +84 -7
- data/lib/rspec/mocks/{stub_const.rb → mutate_const.rb} +117 -40
- data/lib/rspec/mocks/proxy.rb +16 -5
- data/lib/rspec/mocks/version.rb +1 -1
- data/spec/rspec/mocks/and_call_original_spec.rb +162 -0
- data/spec/rspec/mocks/any_instance_spec.rb +18 -7
- data/spec/rspec/mocks/configuration_spec.rb +26 -0
- data/spec/rspec/mocks/failing_argument_matchers_spec.rb +9 -10
- data/spec/rspec/mocks/instance_method_stasher_spec.rb +58 -0
- data/spec/rspec/mocks/mock_spec.rb +35 -35
- data/spec/rspec/mocks/{stub_const_spec.rb → mutate_const_spec.rb} +142 -13
- data/spec/rspec/mocks/null_object_mock_spec.rb +3 -2
- data/spec/rspec/mocks/partial_mock_spec.rb +102 -77
- data/spec/rspec/mocks/serialization_spec.rb +1 -2
- data/spec/rspec/mocks/stub_implementation_spec.rb +6 -6
- data/spec/rspec/mocks_spec.rb +7 -0
- data/spec/spec_helper.rb +11 -0
- metadata +79 -80
- data/lib/rspec/mocks/stashed_instance_method.rb +0 -60
- data/spec/rspec/mocks/stashed_instance_method_spec.rb +0 -53
data/Changelog.md
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
### 2.12.0 / 2012-11-12
|
2
|
+
[full changelog](http://github.com/rspec/rspec-mocks/compare/v2.11.3...2.12.0)
|
3
|
+
|
4
|
+
Enhancements
|
5
|
+
|
6
|
+
* `and_raise` can accept an exception class and message, more closely
|
7
|
+
matching `Kernel#raise` (e.g., `foo.stub(:bar).and_raise(RuntimeError, "message")`)
|
8
|
+
(Bas Vodde)
|
9
|
+
* Add `and_call_original`, which will delegate the message to the
|
10
|
+
original method (Myron Marston).
|
11
|
+
|
12
|
+
Deprecations:
|
13
|
+
|
14
|
+
* Add deprecation warning when using `and_return` with `should_not_receive`
|
15
|
+
(Neha Kumari)
|
16
|
+
|
1
17
|
### 2.11.3 / 2012-09-19
|
2
18
|
[full changelog](http://github.com/rspec/rspec-mocks/compare/v2.11.2...v2.11.3)
|
3
19
|
|
data/README.md
CHANGED
@@ -38,7 +38,7 @@ method stub in one statement:
|
|
38
38
|
book = double("book", :title => "The RSpec Book")
|
39
39
|
```
|
40
40
|
|
41
|
-
The first
|
41
|
+
The first argument is a name, which is used for documentation and appears in
|
42
42
|
failure messages. If you don't care about the name, you can leave it out,
|
43
43
|
making the combined instantiation/stub declaration very terse:
|
44
44
|
|
@@ -233,6 +233,31 @@ double.should_receive(:msg) do |arg|
|
|
233
233
|
end
|
234
234
|
```
|
235
235
|
|
236
|
+
If the method being stubbed itself takes a block, and you need to yield to it
|
237
|
+
in some special way, you can use this:
|
238
|
+
|
239
|
+
```ruby
|
240
|
+
double.should_receive(:msg) do |&arg|
|
241
|
+
begin
|
242
|
+
arg.call
|
243
|
+
ensure
|
244
|
+
# cleanup
|
245
|
+
end
|
246
|
+
end
|
247
|
+
```
|
248
|
+
|
249
|
+
## Delegating to the Original Implementation
|
250
|
+
|
251
|
+
When working with a partial mock object, you may occasionally
|
252
|
+
want to set a message expecation without interfering with how
|
253
|
+
the object responds to the message. You can use `and_call_original`
|
254
|
+
to achieve this:
|
255
|
+
|
256
|
+
```ruby
|
257
|
+
Person.should_receive(:find).and_call_original
|
258
|
+
Person.find # => executes the original find method and returns the result
|
259
|
+
```
|
260
|
+
|
236
261
|
## Combining Expectation Details
|
237
262
|
|
238
263
|
Combining the message name with specific arguments, receive counts and responses
|
@@ -4,7 +4,7 @@ Feature: explicit arguments
|
|
4
4
|
|
5
5
|
Scenario: explicit arguments
|
6
6
|
Given a file named "stub_explicit_args_spec.rb" with:
|
7
|
-
"""
|
7
|
+
"""ruby
|
8
8
|
describe "stubbed explicit arguments" do
|
9
9
|
it "works on stubs" do
|
10
10
|
object = Object.new
|
@@ -32,7 +32,7 @@ Feature: explicit arguments
|
|
32
32
|
|
33
33
|
Scenario: explicit arguments with multiple arities
|
34
34
|
Given a file named "stub_multiple_explicit_args_spec.rb" with:
|
35
|
-
"""
|
35
|
+
"""ruby
|
36
36
|
describe "stubbed multiple explicit arguments" do
|
37
37
|
it "works on stubs" do
|
38
38
|
object = Object.new
|
@@ -7,7 +7,7 @@ Feature: General matchers
|
|
7
7
|
|
8
8
|
Scenario: anything argument matcher
|
9
9
|
Given a file named "stub_anything_args_spec.rb" with:
|
10
|
-
"""
|
10
|
+
"""ruby
|
11
11
|
describe "stubbed anything() args spec" do
|
12
12
|
it "works" do
|
13
13
|
object = Object.new
|
@@ -25,7 +25,7 @@ Feature: General matchers
|
|
25
25
|
|
26
26
|
Scenario: any_args argument matcher
|
27
27
|
Given a file named "stub_any_args_spec.rb" with:
|
28
|
-
"""
|
28
|
+
"""ruby
|
29
29
|
describe "stubbed any_args() args spec" do
|
30
30
|
it "works" do
|
31
31
|
object = Object.new
|
@@ -44,7 +44,7 @@ Feature: General matchers
|
|
44
44
|
|
45
45
|
Scenario: no_args argument matcher
|
46
46
|
Given a file named "stub_no_args_spec.rb" with:
|
47
|
-
"""
|
47
|
+
"""ruby
|
48
48
|
describe "stubbed no_args() args spec" do
|
49
49
|
it "works for no args" do
|
50
50
|
object = Object.new
|
@@ -65,7 +65,7 @@ Feature: General matchers
|
|
65
65
|
|
66
66
|
Scenario: no_args argument matcher for expectations
|
67
67
|
Given a file named "stub_no_args_expectations_spec.rb" with:
|
68
|
-
"""
|
68
|
+
"""ruby
|
69
69
|
describe "stubbed no_args() args spec for expectations" do
|
70
70
|
it "works for no args" do
|
71
71
|
object = Object.new
|
@@ -22,6 +22,10 @@ block contents are evaluated lazily when the `obj` receives the
|
|
22
22
|
# and set a return value
|
23
23
|
end
|
24
24
|
|
25
|
+
### Using the original implementation
|
26
|
+
|
27
|
+
obj.should_receive(:message).and_call_original
|
28
|
+
|
25
29
|
### Raising/Throwing
|
26
30
|
|
27
31
|
obj.should_receive(:message).and_raise("this error")
|
@@ -7,7 +7,7 @@ Feature: expect a message on any instance of a class
|
|
7
7
|
|
8
8
|
Scenario: expect a message on any instance of a class
|
9
9
|
Given a file named "example_spec.rb" with:
|
10
|
-
"""
|
10
|
+
"""ruby
|
11
11
|
describe "any_instance.should_receive" do
|
12
12
|
it "verifies that one instance of the class receives the message" do
|
13
13
|
Object.any_instance.should_receive(:foo).and_return(:return_value)
|
@@ -0,0 +1,24 @@
|
|
1
|
+
Feature: Calling the original method
|
2
|
+
|
3
|
+
You can use `and_call_original` on the fluent interface
|
4
|
+
to "pass through" the received message to the original method.
|
5
|
+
|
6
|
+
Scenario: expect a message
|
7
|
+
Given a file named "call_original_spec.rb" with:
|
8
|
+
"""ruby
|
9
|
+
class Addition
|
10
|
+
def self.two_plus_two
|
11
|
+
4
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "and_call_original" do
|
16
|
+
it "delegates the message to the original implementation" do
|
17
|
+
Addition.should_receive(:two_plus_two).and_call_original
|
18
|
+
Addition.two_plus_two.should eq(4)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
"""
|
22
|
+
When I run `rspec call_original_spec.rb`
|
23
|
+
Then the examples should all pass
|
24
|
+
|
@@ -5,7 +5,7 @@ Feature: expect a message
|
|
5
5
|
|
6
6
|
Scenario: expect a message
|
7
7
|
Given a file named "spec/account_spec.rb" with:
|
8
|
-
"""
|
8
|
+
"""ruby
|
9
9
|
require "account"
|
10
10
|
|
11
11
|
describe Account do
|
@@ -23,7 +23,7 @@ Feature: expect a message
|
|
23
23
|
end
|
24
24
|
"""
|
25
25
|
And a file named "lib/account.rb" with:
|
26
|
-
"""
|
26
|
+
"""ruby
|
27
27
|
class Account
|
28
28
|
attr_accessor :logger
|
29
29
|
|
@@ -37,7 +37,7 @@ Feature: expect a message
|
|
37
37
|
|
38
38
|
Scenario: expect a message with an argument
|
39
39
|
Given a file named "spec/account_spec.rb" with:
|
40
|
-
"""
|
40
|
+
"""ruby
|
41
41
|
require "account"
|
42
42
|
|
43
43
|
describe Account do
|
@@ -55,7 +55,7 @@ Feature: expect a message
|
|
55
55
|
end
|
56
56
|
"""
|
57
57
|
And a file named "lib/account.rb" with:
|
58
|
-
"""
|
58
|
+
"""ruby
|
59
59
|
class Account
|
60
60
|
attr_accessor :logger
|
61
61
|
|
@@ -69,7 +69,7 @@ Feature: expect a message
|
|
69
69
|
|
70
70
|
Scenario: provide a return value
|
71
71
|
Given a file named "message_expectation_spec.rb" with:
|
72
|
-
"""
|
72
|
+
"""ruby
|
73
73
|
describe "a message expectation" do
|
74
74
|
context "with a return value" do
|
75
75
|
context "specified in a block" do
|
@@ -2,7 +2,7 @@ Feature: receive counts
|
|
2
2
|
|
3
3
|
Scenario: expect a message once
|
4
4
|
Given a file named "spec/account_spec.rb" with:
|
5
|
-
"""
|
5
|
+
"""ruby
|
6
6
|
class Account
|
7
7
|
attr_accessor :logger
|
8
8
|
|
@@ -30,7 +30,7 @@ Feature: receive counts
|
|
30
30
|
|
31
31
|
Scenario: expect a message twice
|
32
32
|
Given a file named "spec/account_spec.rb" with:
|
33
|
-
"""
|
33
|
+
"""ruby
|
34
34
|
class Account
|
35
35
|
attr_accessor :logger
|
36
36
|
|
@@ -59,7 +59,7 @@ Feature: receive counts
|
|
59
59
|
|
60
60
|
Scenario: expect a message 3 times
|
61
61
|
Given a file named "spec/account_spec.rb" with:
|
62
|
-
"""
|
62
|
+
"""ruby
|
63
63
|
class Account
|
64
64
|
attr_accessor :logger
|
65
65
|
|
@@ -89,7 +89,7 @@ Feature: receive counts
|
|
89
89
|
|
90
90
|
Scenario: expect a message at least (:once)
|
91
91
|
Given a file named "spec/account_spec.rb" with:
|
92
|
-
"""
|
92
|
+
"""ruby
|
93
93
|
class Account
|
94
94
|
attr_accessor :logger
|
95
95
|
|
@@ -118,7 +118,7 @@ Feature: receive counts
|
|
118
118
|
|
119
119
|
Scenario: expect a message at least (n) times
|
120
120
|
Given a file named "spec/account_spec.rb" with:
|
121
|
-
"""
|
121
|
+
"""ruby
|
122
122
|
class Account
|
123
123
|
attr_accessor :logger
|
124
124
|
|
@@ -151,7 +151,7 @@ Feature: receive counts
|
|
151
151
|
|
152
152
|
Scenario: expect a message at most (:once)
|
153
153
|
Given a file named "spec/account_spec.rb" with:
|
154
|
-
"""
|
154
|
+
"""ruby
|
155
155
|
class Account
|
156
156
|
attr_accessor :logger
|
157
157
|
|
@@ -181,7 +181,7 @@ Feature: receive counts
|
|
181
181
|
|
182
182
|
Scenario: expect a message at most (n) times
|
183
183
|
Given a file named "spec/account_spec.rb" with:
|
184
|
-
"""
|
184
|
+
"""ruby
|
185
185
|
class Account
|
186
186
|
attr_accessor :logger
|
187
187
|
|
@@ -2,7 +2,7 @@ Feature: warn when expectation is set on nil
|
|
2
2
|
|
3
3
|
Scenario: nil instance variable
|
4
4
|
Given a file named "example_spec.rb" with:
|
5
|
-
"""
|
5
|
+
"""ruby
|
6
6
|
RSpec.configure {|c| c.mock_with :rspec}
|
7
7
|
describe "something" do
|
8
8
|
it "does something" do
|
@@ -16,7 +16,7 @@ Feature: warn when expectation is set on nil
|
|
16
16
|
|
17
17
|
Scenario: allow
|
18
18
|
Given a file named "example_spec.rb" with:
|
19
|
-
"""
|
19
|
+
"""ruby
|
20
20
|
RSpec.configure {|c| c.mock_with :rspec}
|
21
21
|
describe "something" do
|
22
22
|
it "does something" do
|
@@ -31,7 +31,7 @@ Feature: warn when expectation is set on nil
|
|
31
31
|
|
32
32
|
Scenario: allow in one example, but not on another
|
33
33
|
Given a file named "example_spec.rb" with:
|
34
|
-
"""
|
34
|
+
"""ruby
|
35
35
|
RSpec.configure {|c| c.mock_with :rspec}
|
36
36
|
describe "something" do
|
37
37
|
it "does something (foo)" do
|
@@ -8,7 +8,7 @@ Feature: stub on any instance of a class
|
|
8
8
|
|
9
9
|
Scenario: any_instance stub with a single return value
|
10
10
|
Given a file named "example_spec.rb" with:
|
11
|
-
"""
|
11
|
+
"""ruby
|
12
12
|
describe "any_instance.stub" do
|
13
13
|
it "returns the specified value on any instance of the class" do
|
14
14
|
Object.any_instance.stub(:foo).and_return(:return_value)
|
@@ -23,7 +23,7 @@ Feature: stub on any instance of a class
|
|
23
23
|
|
24
24
|
Scenario: any_instance stub with a hash
|
25
25
|
Given a file named "example_spec.rb" with:
|
26
|
-
"""
|
26
|
+
"""ruby
|
27
27
|
describe "any_instance.stub" do
|
28
28
|
context "with a hash" do
|
29
29
|
it "returns the hash values on any instance of the class" do
|
@@ -41,7 +41,7 @@ Feature: stub on any instance of a class
|
|
41
41
|
|
42
42
|
Scenario: any_instance stub with specific arguments matchers
|
43
43
|
Given a file named "example_spec.rb" with:
|
44
|
-
"""
|
44
|
+
"""ruby
|
45
45
|
describe "any_instance.stub" do
|
46
46
|
context "with arguments" do
|
47
47
|
it "returns the stubbed value when arguments match" do
|
@@ -60,7 +60,7 @@ Feature: stub on any instance of a class
|
|
60
60
|
|
61
61
|
Scenario: any_instance unstub
|
62
62
|
Given a file named "example_spec.rb" with:
|
63
|
-
"""
|
63
|
+
"""ruby
|
64
64
|
describe "any_instance.unstub" do
|
65
65
|
it "unstubs a stubbed method" do
|
66
66
|
class Object
|
@@ -81,7 +81,7 @@ Feature: stub on any instance of a class
|
|
81
81
|
|
82
82
|
Scenario: any_instance unstub
|
83
83
|
Given a file named "example_spec.rb" with:
|
84
|
-
"""
|
84
|
+
"""ruby
|
85
85
|
describe "any_instance.unstub" do
|
86
86
|
context "with both an expectation and a stub already set" do
|
87
87
|
it "only removes the stub" do
|
@@ -104,7 +104,7 @@ Feature: stub on any instance of a class
|
|
104
104
|
|
105
105
|
Scenario: stub a chain of methods an any instance
|
106
106
|
Given a file named "stub_chain_spec.rb" with:
|
107
|
-
"""
|
107
|
+
"""ruby
|
108
108
|
describe "stubbing a chain of methods" do
|
109
109
|
context "given symbols representing methods" do
|
110
110
|
it "returns the correct value" do
|
@@ -130,4 +130,3 @@ Feature: stub on any instance of a class
|
|
130
130
|
"""
|
131
131
|
When I run `rspec stub_chain_spec.rb`
|
132
132
|
Then the examples should all pass
|
133
|
-
|
@@ -6,7 +6,7 @@ Feature: stub with a simple return value
|
|
6
6
|
|
7
7
|
Scenario: stub with no return value
|
8
8
|
Given a file named "example_spec.rb" with:
|
9
|
-
"""
|
9
|
+
"""ruby
|
10
10
|
describe "a stub with no return value specified" do
|
11
11
|
let(:collaborator) { double("collaborator") }
|
12
12
|
|
@@ -21,7 +21,7 @@ Feature: stub with a simple return value
|
|
21
21
|
|
22
22
|
Scenario: stubs with return values
|
23
23
|
Given a file named "example_spec.rb" with:
|
24
|
-
"""
|
24
|
+
"""ruby
|
25
25
|
describe "a stub with a return value" do
|
26
26
|
context "specified in a block" do
|
27
27
|
it "returns the specified value" do
|
@@ -1,4 +1,6 @@
|
|
1
|
-
##
|
1
|
+
## Mutating Constants
|
2
|
+
|
3
|
+
### Stubbing
|
2
4
|
|
3
5
|
Support is provided for stubbing constants. Like with method stubs, the
|
4
6
|
stubbed constants will be restored to their original state when an
|
@@ -60,3 +62,21 @@ CardDeck::SUITS # => [:Spades, :Diamonds, :Clubs, :Hearts]
|
|
60
62
|
CardDeck::NUM_CARDS # => raises uninitialized constant error
|
61
63
|
```
|
62
64
|
|
65
|
+
### Hiding
|
66
|
+
|
67
|
+
Support is also provided for hiding constants. Hiding a constant temporarily
|
68
|
+
removes it; it is restored to its original value after the test completes.
|
69
|
+
|
70
|
+
```ruby
|
71
|
+
FOO = 42
|
72
|
+
hide_const("FOO")
|
73
|
+
FOO => NameError: uninitialized constant FOO
|
74
|
+
```
|
75
|
+
|
76
|
+
Like stubbed constants, names must be fully qualified.
|
77
|
+
|
78
|
+
Hiding constants that are already undefined has no effect.
|
79
|
+
|
80
|
+
```ruby
|
81
|
+
hide_const("NO_OP")
|
82
|
+
```
|