verified_double 0.3.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.markdown +17 -0
- data/README.md +17 -6
- data/features/CHANGELOG.markdown +17 -0
- data/features/accessor_method_contracts.feature +2 -9
- data/features/customizing_arguments_and_return_values.feature +3 -8
- data/features/readme.md +17 -6
- data/features/rspec_mock_compatibility.feature +46 -65
- data/features/step_definitions/verified_double_steps.rb +4 -8
- data/features/verified_mocks.feature +6 -11
- data/features/verified_stubs.feature +12 -28
- data/lib/verified_double.rb +12 -1
- data/lib/verified_double/recorded_method_signature.rb +6 -1
- data/lib/verified_double/recorded_method_signature_registry.rb +6 -5
- data/lib/verified_double/rspec_configuration.rb +11 -0
- data/lib/verified_double/rspec_mocks_syntax_overrides.rb +30 -0
- data/lib/verified_double/simple_double.rb +8 -0
- data/lib/verified_double/version.rb +1 -1
- data/spec/spec_helper.rb +1 -4
- data/spec/verified_double/can_record_interactions_spec.rb +3 -3
- data/spec/verified_double/method_signatures_report_spec.rb +28 -27
- data/spec/verified_double/recorded_method_signature_registry_spec.rb +19 -9
- data/spec/verified_double/recorded_method_signature_spec.rb +9 -5
- data/spec/verified_double/rspec_mocks_syntax_overrides_spec.rb +79 -0
- data/spec/verified_double/simple_double_spec.rb +12 -0
- data/spec/verified_double_spec.rb +30 -3
- metadata +6 -2
data/CHANGELOG.markdown
CHANGED
@@ -1,4 +1,21 @@
|
|
1
|
+
0.4.0 - 2013-07-28
|
2
|
+
------------------
|
3
|
+
|
4
|
+
[#7] Pass: I should be able to use the RSpec's new expect syntax with
|
5
|
+
VerifiedDouble.
|
6
|
+
|
7
|
+
[#7] Require verified_double/rspec_configuration in order to integrate
|
8
|
+
verified_double with rspec.
|
9
|
+
|
10
|
+
[#18] Fix Scenario: stubbed doubles using hash syntax are no longer being
|
11
|
+
recorded after 0.3.0.
|
12
|
+
|
13
|
+
[#19] Ensure: if `VerifiedDouble.of_instance(class_name, method_stubs={})` is
|
14
|
+
used a argument or return value value of an expectation, then it should
|
15
|
+
not interfere with the method signature recording of the expectation.
|
16
|
+
|
1
17
|
0.3.0 - 2013-07-19
|
18
|
+
------------------
|
2
19
|
|
3
20
|
* [#17] Major refactor: extend RSpec doubles with VerifiedDouble recording
|
4
21
|
functionality. No more need for RecordingDouble.
|
data/README.md
CHANGED
@@ -7,7 +7,7 @@ VerifiedDouble is a gem for verifying rspec mocks. The gem works similar to [rsp
|
|
7
7
|
For example, let's say I mocked the created_at method of a model like this:
|
8
8
|
|
9
9
|
item = VerifiedDouble.of_instance(Item)
|
10
|
-
item.
|
10
|
+
expect(item).to receive(:created_at).and_return(Time.now)
|
11
11
|
|
12
12
|
When running the tests, the gem looks for a "contract test" tagged with the method's signature. This test should ensure that calling #created_at on Item will return a Time object.
|
13
13
|
|
@@ -19,13 +19,26 @@ If this test does not exist, the gem will complain that the mock is not verified
|
|
19
19
|
|
20
20
|
I got the idea from http://www.infoq.com/presentations/integration-tests-scam, an old (2009) talk that still has some fresh insights on dealing with API changes in your mocked tests.
|
21
21
|
|
22
|
+
Usage
|
23
|
+
-----
|
24
|
+
|
25
|
+
Require `verified_double/rspec_configuration` in your spec_helper.rb to integrate VerifiedDouble with rspec. If you want verified_double to be run only as needed, create a separate verified_spec_helper.rb:
|
26
|
+
|
27
|
+
# spec/verified_spec_helper.rb
|
28
|
+
require 'spec_helper'
|
29
|
+
require 'verified_double/rspec_configuration'
|
30
|
+
|
31
|
+
And require it when running rspec:
|
32
|
+
|
33
|
+
rspec -r ./spec/verified_spec_helper.rb
|
34
|
+
|
22
35
|
You can learn more about using the gem at https://www.relishapp.com/gsmendoza/verified-double.
|
23
36
|
|
24
37
|
Actively tested against
|
25
38
|
-----------------------
|
26
39
|
|
27
40
|
* Ruby 1.9.3
|
28
|
-
* RSpec 2.
|
41
|
+
* RSpec 2.14
|
29
42
|
|
30
43
|
|
31
44
|
Alternatives
|
@@ -36,13 +49,11 @@ Alternatives
|
|
36
49
|
Caveats
|
37
50
|
-------
|
38
51
|
|
39
|
-
VerifiedDouble
|
40
|
-
|
41
|
-
* If you check the RelishApp doc, the gem only supports a subset of rspec-mock's API. Please post an issue at http://github.com/gsmendoza/verified_double if you need support for any particular rspec-mock API.
|
52
|
+
* With 0.3.0, doubles created with VerifiedDouble.of_instance() and VerifiedDouble.of_class() are now VerifiedDouble-extended RSpec doubles. As a result, they should function like regular RSpec doubles. However, VerifiedDouble still doesn't have support for [RSpec mock argument matchers](https://github.com/rspec/rspec-mocks#argument-matchers). Please post an issue at http://github.com/gsmendoza/verified_double if you need support for any particular rspec-mock API.
|
42
53
|
|
43
54
|
* The [method documentation](http://rubydoc.info/gems/verified_double) is pretty empty at this point :p I'm planning to use yard-spec to document the methods but that gem doesn't support rspec context blocks. I'll try to work on that soon.
|
44
55
|
|
45
56
|
Special thanks
|
46
57
|
--------------
|
47
58
|
|
48
|
-
To [Thomas Sinclair](https://twitter.com/anathematic)
|
59
|
+
To [Thomas Sinclair](https://twitter.com/anathematic) of [Inner Core Designs](http://icdesign.com.au) for sponsoring this gem :)
|
data/features/CHANGELOG.markdown
CHANGED
@@ -1,4 +1,21 @@
|
|
1
|
+
0.4.0 - 2013-07-28
|
2
|
+
------------------
|
3
|
+
|
4
|
+
[#7] Pass: I should be able to use the RSpec's new expect syntax with
|
5
|
+
VerifiedDouble.
|
6
|
+
|
7
|
+
[#7] Require verified_double/rspec_configuration in order to integrate
|
8
|
+
verified_double with rspec.
|
9
|
+
|
10
|
+
[#18] Fix Scenario: stubbed doubles using hash syntax are no longer being
|
11
|
+
recorded after 0.3.0.
|
12
|
+
|
13
|
+
[#19] Ensure: if `VerifiedDouble.of_instance(class_name, method_stubs={})` is
|
14
|
+
used a argument or return value value of an expectation, then it should
|
15
|
+
not interfere with the method signature recording of the expectation.
|
16
|
+
|
1
17
|
0.3.0 - 2013-07-19
|
18
|
+
------------------
|
2
19
|
|
3
20
|
* [#17] Major refactor: extend RSpec doubles with VerifiedDouble recording
|
4
21
|
functionality. No more need for RecordingDouble.
|
@@ -19,18 +19,11 @@ Feature: 05. Accessor method contracts
|
|
19
19
|
end
|
20
20
|
"""
|
21
21
|
|
22
|
-
And the test suite
|
22
|
+
And the test suite is configured to use VerifiedDouble:
|
23
23
|
"""
|
24
24
|
require 'verified_double'
|
25
|
+
require 'verified_double/rspec_configuration'
|
25
26
|
require 'main'
|
26
|
-
|
27
|
-
RSpec.configure do |config|
|
28
|
-
config.include VerifiedDouble::Matchers
|
29
|
-
|
30
|
-
config.after :suite do
|
31
|
-
VerifiedDouble.report_unverified_signatures(self)
|
32
|
-
end
|
33
|
-
end
|
34
27
|
"""
|
35
28
|
|
36
29
|
Scenario: Verifying mocks for accessors
|
@@ -17,16 +17,11 @@ Feature: 04. Customizing arguments and return values
|
|
17
17
|
end
|
18
18
|
"""
|
19
19
|
|
20
|
-
And the test suite
|
20
|
+
And the test suite is configured to use VerifiedDouble:
|
21
21
|
"""
|
22
22
|
require 'verified_double'
|
23
|
+
require 'verified_double/rspec_configuration'
|
23
24
|
require 'main'
|
24
|
-
|
25
|
-
RSpec.configure do |config|
|
26
|
-
config.after :suite do
|
27
|
-
VerifiedDouble.report_unverified_signatures(self)
|
28
|
-
end
|
29
|
-
end
|
30
25
|
"""
|
31
26
|
|
32
27
|
And a test that uses VerifiedDouble to mock an object:
|
@@ -38,7 +33,7 @@ Feature: 04. Customizing arguments and return values
|
|
38
33
|
let(:instance_double) { VerifiedDouble.of_instance('Collaborator') }
|
39
34
|
|
40
35
|
it "tests something" do
|
41
|
-
instance_double.
|
36
|
+
expect(instance_double).to receive(:some_method).with(input).and_return(output)
|
42
37
|
ObjectUnderTest.new.do_something(instance_double, input)
|
43
38
|
end
|
44
39
|
end
|
data/features/readme.md
CHANGED
@@ -7,7 +7,7 @@ VerifiedDouble is a gem for verifying rspec mocks. The gem works similar to [rsp
|
|
7
7
|
For example, let's say I mocked the created_at method of a model like this:
|
8
8
|
|
9
9
|
item = VerifiedDouble.of_instance(Item)
|
10
|
-
item.
|
10
|
+
expect(item).to receive(:created_at).and_return(Time.now)
|
11
11
|
|
12
12
|
When running the tests, the gem looks for a "contract test" tagged with the method's signature. This test should ensure that calling #created_at on Item will return a Time object.
|
13
13
|
|
@@ -19,13 +19,26 @@ If this test does not exist, the gem will complain that the mock is not verified
|
|
19
19
|
|
20
20
|
I got the idea from http://www.infoq.com/presentations/integration-tests-scam, an old (2009) talk that still has some fresh insights on dealing with API changes in your mocked tests.
|
21
21
|
|
22
|
+
Usage
|
23
|
+
-----
|
24
|
+
|
25
|
+
Require `verified_double/rspec_configuration` in your spec_helper.rb to integrate VerifiedDouble with rspec. If you want verified_double to be run only as needed, create a separate verified_spec_helper.rb:
|
26
|
+
|
27
|
+
# spec/verified_spec_helper.rb
|
28
|
+
require 'spec_helper'
|
29
|
+
require 'verified_double/rspec_configuration'
|
30
|
+
|
31
|
+
And require it when running rspec:
|
32
|
+
|
33
|
+
rspec -r ./spec/verified_spec_helper.rb
|
34
|
+
|
22
35
|
You can learn more about using the gem at https://www.relishapp.com/gsmendoza/verified-double.
|
23
36
|
|
24
37
|
Actively tested against
|
25
38
|
-----------------------
|
26
39
|
|
27
40
|
* Ruby 1.9.3
|
28
|
-
* RSpec 2.
|
41
|
+
* RSpec 2.14
|
29
42
|
|
30
43
|
|
31
44
|
Alternatives
|
@@ -36,13 +49,11 @@ Alternatives
|
|
36
49
|
Caveats
|
37
50
|
-------
|
38
51
|
|
39
|
-
VerifiedDouble
|
40
|
-
|
41
|
-
* If you check the RelishApp doc, the gem only supports a subset of rspec-mock's API. Please post an issue at http://github.com/gsmendoza/verified_double if you need support for any particular rspec-mock API.
|
52
|
+
* With 0.3.0, doubles created with VerifiedDouble.of_instance() and VerifiedDouble.of_class() are now VerifiedDouble-extended RSpec doubles. As a result, they should function like regular RSpec doubles. However, VerifiedDouble still doesn't have support for [RSpec mock argument matchers](https://github.com/rspec/rspec-mocks#argument-matchers). Please post an issue at http://github.com/gsmendoza/verified_double if you need support for any particular rspec-mock API.
|
42
53
|
|
43
54
|
* The [method documentation](http://rubydoc.info/gems/verified_double) is pretty empty at this point :p I'm planning to use yard-spec to document the methods but that gem doesn't support rspec context blocks. I'll try to work on that soon.
|
44
55
|
|
45
56
|
Special thanks
|
46
57
|
--------------
|
47
58
|
|
48
|
-
To [Thomas Sinclair](https://twitter.com/anathematic)
|
59
|
+
To [Thomas Sinclair](https://twitter.com/anathematic) of [Inner Core Designs](http://icdesign.com.au) for sponsoring this gem :)
|
@@ -31,27 +31,11 @@ Feature: 03. Rspec Mock compatibility
|
|
31
31
|
end
|
32
32
|
"""
|
33
33
|
|
34
|
-
And the test suite
|
35
|
-
"""
|
36
|
-
require 'spec_helper'
|
37
|
-
|
38
|
-
describe 'Collaborator' do
|
39
|
-
it "tests something", verifies_contract: 'Collaborator#some_method(SomeInput)=>SomeOutput' do
|
40
|
-
# do nothing
|
41
|
-
end
|
42
|
-
end
|
43
|
-
"""
|
44
|
-
|
45
|
-
And the test suite has an after(:suite) callback asking VerifiedDouble to report unverified doubles:
|
34
|
+
And the test suite is configured to use VerifiedDouble:
|
46
35
|
"""
|
47
36
|
require 'verified_double'
|
37
|
+
require 'verified_double/rspec_configuration'
|
48
38
|
require 'main'
|
49
|
-
|
50
|
-
RSpec.configure do |config|
|
51
|
-
config.after :suite do
|
52
|
-
VerifiedDouble.report_unverified_signatures(self)
|
53
|
-
end
|
54
|
-
end
|
55
39
|
"""
|
56
40
|
|
57
41
|
Scenario: once
|
@@ -64,14 +48,20 @@ Feature: 03. Rspec Mock compatibility
|
|
64
48
|
let(:instance_double) { VerifiedDouble.of_instance('Collaborator') }
|
65
49
|
|
66
50
|
it "tests something" do
|
67
|
-
instance_double.
|
51
|
+
expect(instance_double).to receive(:some_method).with(input).once.and_return(output)
|
68
52
|
ObjectUnderTest.new.do_something(instance_double, input)
|
69
53
|
end
|
70
54
|
end
|
71
55
|
"""
|
72
56
|
|
73
57
|
When I run the test suite
|
74
|
-
|
58
|
+
|
59
|
+
Then I should be informed that the mock is unverified:
|
60
|
+
"""
|
61
|
+
The following mocks are not verified:
|
62
|
+
|
63
|
+
1. Collaborator#some_method(SomeInput)=>SomeOutput
|
64
|
+
"""
|
75
65
|
|
76
66
|
Scenario: twice
|
77
67
|
Given a test that uses VerifiedDouble to mock an object:
|
@@ -83,14 +73,20 @@ Feature: 03. Rspec Mock compatibility
|
|
83
73
|
let(:instance_double) { VerifiedDouble.of_instance('Collaborator') }
|
84
74
|
|
85
75
|
it "tests something" do
|
86
|
-
instance_double.
|
76
|
+
expect(instance_double).to receive(:some_method).with(input).twice.and_return(output)
|
87
77
|
ObjectUnderTest.new.do_something_twice(instance_double, input)
|
88
78
|
end
|
89
79
|
end
|
90
80
|
"""
|
91
81
|
|
92
82
|
When I run the test suite
|
93
|
-
|
83
|
+
|
84
|
+
Then I should be informed that the mock is unverified:
|
85
|
+
"""
|
86
|
+
The following mocks are not verified:
|
87
|
+
|
88
|
+
1. Collaborator#some_method(SomeInput)=>SomeOutput
|
89
|
+
"""
|
94
90
|
|
95
91
|
Scenario: exactly
|
96
92
|
Given a test that uses VerifiedDouble to mock an object:
|
@@ -102,14 +98,19 @@ Feature: 03. Rspec Mock compatibility
|
|
102
98
|
let(:instance_double) { VerifiedDouble.of_instance('Collaborator') }
|
103
99
|
|
104
100
|
it "tests something" do
|
105
|
-
instance_double.
|
101
|
+
expect(instance_double).to receive(:some_method).with(input).exactly(1).and_return(output)
|
106
102
|
ObjectUnderTest.new.do_something(instance_double, input)
|
107
103
|
end
|
108
104
|
end
|
109
105
|
"""
|
110
106
|
|
111
107
|
When I run the test suite
|
112
|
-
Then I should
|
108
|
+
Then I should be informed that the mock is unverified:
|
109
|
+
"""
|
110
|
+
The following mocks are not verified:
|
111
|
+
|
112
|
+
1. Collaborator#some_method(SomeInput)=>SomeOutput
|
113
|
+
"""
|
113
114
|
|
114
115
|
Scenario: at_least
|
115
116
|
Given a test that uses VerifiedDouble to mock an object:
|
@@ -121,14 +122,19 @@ Feature: 03. Rspec Mock compatibility
|
|
121
122
|
let(:instance_double) { VerifiedDouble.of_instance('Collaborator') }
|
122
123
|
|
123
124
|
it "tests something" do
|
124
|
-
instance_double.
|
125
|
+
expect(instance_double).to receive(:some_method).with(input).at_least(:once).and_return(output)
|
125
126
|
ObjectUnderTest.new.do_something(instance_double, input)
|
126
127
|
end
|
127
128
|
end
|
128
129
|
"""
|
129
130
|
|
130
131
|
When I run the test suite
|
131
|
-
Then I should
|
132
|
+
Then I should be informed that the mock is unverified:
|
133
|
+
"""
|
134
|
+
The following mocks are not verified:
|
135
|
+
|
136
|
+
1. Collaborator#some_method(SomeInput)=>SomeOutput
|
137
|
+
"""
|
132
138
|
|
133
139
|
Scenario: at_most
|
134
140
|
Given a test that uses VerifiedDouble to mock an object:
|
@@ -140,34 +146,20 @@ Feature: 03. Rspec Mock compatibility
|
|
140
146
|
let(:instance_double) { VerifiedDouble.of_instance('Collaborator') }
|
141
147
|
|
142
148
|
it "tests something" do
|
143
|
-
instance_double.
|
149
|
+
expect(instance_double).to receive(:some_method).with(input).at_most(:once).and_return(output)
|
144
150
|
ObjectUnderTest.new.do_something(instance_double, input)
|
145
151
|
end
|
146
152
|
end
|
147
153
|
"""
|
148
154
|
|
149
155
|
When I run the test suite
|
150
|
-
Then I should
|
151
|
-
|
152
|
-
Scenario: any_number_of_times
|
153
|
-
Given a test that uses VerifiedDouble to mock an object:
|
156
|
+
Then I should be informed that the mock is unverified:
|
154
157
|
"""
|
155
|
-
|
156
|
-
describe ObjectUnderTest do
|
157
|
-
let(:input) { SomeInput.new }
|
158
|
-
let(:output) { SomeOutput.new }
|
159
|
-
let(:instance_double) { VerifiedDouble.of_instance('Collaborator') }
|
158
|
+
The following mocks are not verified:
|
160
159
|
|
161
|
-
|
162
|
-
instance_double.should_receive(:some_method).with(input).any_number_of_times.and_return(output)
|
163
|
-
ObjectUnderTest.new.do_something(instance_double, input)
|
164
|
-
end
|
165
|
-
end
|
160
|
+
1. Collaborator#some_method(SomeInput)=>SomeOutput
|
166
161
|
"""
|
167
162
|
|
168
|
-
When I run the test suite
|
169
|
-
Then I should not see any output saying the stub is unverified
|
170
|
-
|
171
163
|
Scenario: and_raise
|
172
164
|
Given a test that uses VerifiedDouble to mock an object:
|
173
165
|
"""
|
@@ -179,25 +171,20 @@ Feature: 03. Rspec Mock compatibility
|
|
179
171
|
let(:instance_double) { VerifiedDouble.of_instance('Collaborator') }
|
180
172
|
|
181
173
|
it "tests something" do
|
182
|
-
instance_double.
|
174
|
+
expect(instance_double).to receive(:some_method).with(input).and_raise(error)
|
183
175
|
expect { ObjectUnderTest.new.do_something(instance_double, input) }.to raise_error(error)
|
184
176
|
end
|
185
177
|
end
|
186
178
|
"""
|
187
179
|
|
188
|
-
|
180
|
+
When I run the test suite
|
181
|
+
Then I should be informed that the mock is unverified:
|
189
182
|
"""
|
190
|
-
|
183
|
+
The following mocks are not verified:
|
191
184
|
|
192
|
-
|
193
|
-
it "tests something", verifies_contract: 'Collaborator#some_method(SomeInput)' do
|
194
|
-
# do nothing
|
195
|
-
end
|
196
|
-
end
|
185
|
+
1. Collaborator#some_method(SomeInput)
|
197
186
|
"""
|
198
187
|
|
199
|
-
When I run the test suite
|
200
|
-
Then I should not see any output saying the stub is unverified
|
201
188
|
Scenario: and_throw
|
202
189
|
Given a test that uses VerifiedDouble to mock an object:
|
203
190
|
"""
|
@@ -209,22 +196,16 @@ Feature: 03. Rspec Mock compatibility
|
|
209
196
|
let(:instance_double) { VerifiedDouble.of_instance('Collaborator') }
|
210
197
|
|
211
198
|
it "tests something" do
|
212
|
-
instance_double.
|
199
|
+
expect(instance_double).to receive(:some_method).with(input).and_throw(error_symbol)
|
213
200
|
expect { ObjectUnderTest.new.do_something(instance_double, input) }.to throw_symbol(error_symbol)
|
214
201
|
end
|
215
202
|
end
|
216
203
|
"""
|
217
204
|
|
218
|
-
|
205
|
+
When I run the test suite
|
206
|
+
Then I should be informed that the mock is unverified:
|
219
207
|
"""
|
220
|
-
|
208
|
+
The following mocks are not verified:
|
221
209
|
|
222
|
-
|
223
|
-
it "tests something", verifies_contract: 'Collaborator#some_method(SomeInput)' do
|
224
|
-
# do nothing
|
225
|
-
end
|
226
|
-
end
|
210
|
+
1. Collaborator#some_method(SomeInput)
|
227
211
|
"""
|
228
|
-
|
229
|
-
When I run the test suite
|
230
|
-
Then I should not see any output saying the stub is unverified
|
@@ -2,14 +2,6 @@ Given /^the following classes:$/ do |string|
|
|
2
2
|
write_file 'lib/main.rb', string
|
3
3
|
end
|
4
4
|
|
5
|
-
Given /^the test suite includes VerifiedDouble to verify doubles with accessor methods:$/ do |string|
|
6
|
-
write_file 'spec/spec_helper.rb', string
|
7
|
-
end
|
8
|
-
|
9
|
-
Given /^the test suite has an after\(:suite\) callback asking VerifiedDouble to report unverified doubles:$/ do |string|
|
10
|
-
write_file 'spec/spec_helper.rb', string
|
11
|
-
end
|
12
|
-
|
13
5
|
Given /^a test that uses VerifiedDouble to mock an object:$/ do |string|
|
14
6
|
write_file 'spec/main_spec.rb', string
|
15
7
|
end
|
@@ -30,6 +22,10 @@ Given /^the test suite has a contract test for the stub:$/ do |string|
|
|
30
22
|
write_file 'spec/contract_test_for_main_spec.rb', string
|
31
23
|
end
|
32
24
|
|
25
|
+
Given(/^the test suite is configured to use VerifiedDouble:$/) do |string|
|
26
|
+
write_file 'spec/spec_helper.rb', string
|
27
|
+
end
|
28
|
+
|
33
29
|
Given /^the test suite does not have a contract test for the mock$/ do
|
34
30
|
# do nothing
|
35
31
|
end
|
@@ -30,16 +30,11 @@ Feature: 01. Verified mocks
|
|
30
30
|
end
|
31
31
|
"""
|
32
32
|
|
33
|
-
And the test suite
|
33
|
+
And the test suite is configured to use VerifiedDouble:
|
34
34
|
"""
|
35
35
|
require 'verified_double'
|
36
|
+
require 'verified_double/rspec_configuration'
|
36
37
|
require 'main'
|
37
|
-
|
38
|
-
RSpec.configure do |config|
|
39
|
-
config.after :suite do
|
40
|
-
VerifiedDouble.report_unverified_signatures(self)
|
41
|
-
end
|
42
|
-
end
|
43
38
|
"""
|
44
39
|
|
45
40
|
Scenario: Verified instance doubles
|
@@ -52,7 +47,7 @@ Feature: 01. Verified mocks
|
|
52
47
|
let(:instance_double) { VerifiedDouble.of_instance('Collaborator') }
|
53
48
|
|
54
49
|
it "tests something" do
|
55
|
-
instance_double.
|
50
|
+
expect(instance_double).to receive(:some_method).with(input).and_return(output)
|
56
51
|
ObjectUnderTest.new.do_something(instance_double, input)
|
57
52
|
end
|
58
53
|
end
|
@@ -82,7 +77,7 @@ Feature: 01. Verified mocks
|
|
82
77
|
let(:instance_double) { VerifiedDouble.of_instance('Collaborator') }
|
83
78
|
|
84
79
|
it "tests something" do
|
85
|
-
instance_double.
|
80
|
+
expect(instance_double).to receive(:some_method).with(input).and_return(output)
|
86
81
|
ObjectUnderTest.new.do_something(instance_double, input)
|
87
82
|
end
|
88
83
|
end
|
@@ -107,7 +102,7 @@ Feature: 01. Verified mocks
|
|
107
102
|
let(:class_double) { VerifiedDouble.of_class('Collaborator') }
|
108
103
|
|
109
104
|
it "tests something" do
|
110
|
-
class_double.
|
105
|
+
expect(class_double).to receive(:some_method).with(input).and_return(output)
|
111
106
|
ObjectUnderTest.do_something(input)
|
112
107
|
end
|
113
108
|
end
|
@@ -137,7 +132,7 @@ Feature: 01. Verified mocks
|
|
137
132
|
let(:class_double) { VerifiedDouble.of_class('Collaborator') }
|
138
133
|
|
139
134
|
it "tests something" do
|
140
|
-
class_double.
|
135
|
+
expect(class_double).to receive(:some_method).with(input).and_return(output)
|
141
136
|
ObjectUnderTest.new.do_something(class_double, input)
|
142
137
|
end
|
143
138
|
end
|
@@ -23,17 +23,13 @@ Feature: 02. Verified stubs
|
|
23
23
|
end
|
24
24
|
"""
|
25
25
|
|
26
|
-
And the test suite
|
26
|
+
And the test suite is configured to use VerifiedDouble:
|
27
27
|
"""
|
28
28
|
require 'verified_double'
|
29
|
+
require 'verified_double/rspec_configuration'
|
29
30
|
require 'main'
|
30
|
-
|
31
|
-
RSpec.configure do |config|
|
32
|
-
config.after :suite do
|
33
|
-
VerifiedDouble.report_unverified_signatures(self)
|
34
|
-
end
|
35
|
-
end
|
36
31
|
"""
|
32
|
+
|
37
33
|
Scenario: Stubbed doubles
|
38
34
|
Given a test that uses VerifiedDouble to stub an object:
|
39
35
|
"""
|
@@ -44,26 +40,20 @@ Feature: 02. Verified stubs
|
|
44
40
|
let(:instance_double) { VerifiedDouble.of_instance('Collaborator') }
|
45
41
|
|
46
42
|
it "tests something" do
|
47
|
-
instance_double.
|
43
|
+
allow(instance_double).to receive(:some_method).with(input).and_return(output)
|
48
44
|
ObjectUnderTest.new.do_something(instance_double, input)
|
49
45
|
end
|
50
46
|
end
|
51
47
|
"""
|
52
48
|
|
53
|
-
|
49
|
+
When I run the test suite
|
50
|
+
Then I should be informed that the mock is unverified:
|
54
51
|
"""
|
55
|
-
|
52
|
+
The following mocks are not verified:
|
56
53
|
|
57
|
-
|
58
|
-
it "tests something", verifies_contract: 'Collaborator#some_method(SomeInput)=>SomeOutput' do
|
59
|
-
# do nothing
|
60
|
-
end
|
61
|
-
end
|
54
|
+
1. Collaborator#some_method(SomeInput)=>SomeOutput
|
62
55
|
"""
|
63
56
|
|
64
|
-
When I run the test suite
|
65
|
-
Then I should not see any output saying the stub is unverified
|
66
|
-
|
67
57
|
Scenario: Stubbed doubles using hash syntax
|
68
58
|
Given a test that uses VerifiedDouble to stub an object:
|
69
59
|
"""
|
@@ -79,16 +69,10 @@ Feature: 02. Verified stubs
|
|
79
69
|
end
|
80
70
|
"""
|
81
71
|
|
82
|
-
|
72
|
+
When I run the test suite
|
73
|
+
Then I should be informed that the mock is unverified:
|
83
74
|
"""
|
84
|
-
|
75
|
+
The following mocks are not verified:
|
85
76
|
|
86
|
-
|
87
|
-
it "tests something", verifies_contract: 'Collaborator#some_method=>SomeOutput' do
|
88
|
-
# do nothing
|
89
|
-
end
|
90
|
-
end
|
77
|
+
1. Collaborator#some_method()=>SomeOutput
|
91
78
|
"""
|
92
|
-
|
93
|
-
When I run the test suite
|
94
|
-
Then I should not see any output saying the stub is unverified
|
data/lib/verified_double.rb
CHANGED
@@ -12,6 +12,7 @@ require 'verified_double/method_signature/class_value'
|
|
12
12
|
require 'verified_double/method_signature/rspec_double_value'
|
13
13
|
require 'verified_double/method_signatures_report'
|
14
14
|
require 'verified_double/parse_method_signature'
|
15
|
+
require 'verified_double/rspec_mocks_syntax_overrides'
|
15
16
|
require 'verified_double/recorded_method_signature'
|
16
17
|
require 'verified_double/recorded_method_signature_registry'
|
17
18
|
require 'verified_double/simple_double'
|
@@ -26,7 +27,17 @@ module VerifiedDouble
|
|
26
27
|
end
|
27
28
|
|
28
29
|
def self.of_instance(*args)
|
29
|
-
|
30
|
+
d = double(*args)
|
31
|
+
simple_double = SimpleDouble.new(d)
|
32
|
+
|
33
|
+
if args[1]
|
34
|
+
args[1].each do |method, return_value|
|
35
|
+
method_signature = simple_double.build_recorded_method_signature(method)
|
36
|
+
method_signature.return_values = [MethodSignature::Value.from(return_value)]
|
37
|
+
VerifiedDouble.registry.insert 0, method_signature
|
38
|
+
end
|
39
|
+
end
|
40
|
+
VerifiedDouble.record(d)
|
30
41
|
end
|
31
42
|
|
32
43
|
def self.record(a_double)
|
@@ -1,6 +1,11 @@
|
|
1
1
|
module VerifiedDouble
|
2
2
|
class RecordedMethodSignature < MethodSignature
|
3
|
-
|
3
|
+
attr_reader :stack_frame
|
4
|
+
|
5
|
+
def initialize(*args)
|
6
|
+
@stack_frame = StackFrame.new(caller(0).detect{|line| line =~ /_spec\.rb/ })
|
7
|
+
super(*args)
|
8
|
+
end
|
4
9
|
|
5
10
|
def to_s
|
6
11
|
"#{super}\n # #{stack_frame}"
|
@@ -1,13 +1,14 @@
|
|
1
1
|
module VerifiedDouble
|
2
2
|
class RecordedMethodSignatureRegistry < Array
|
3
|
+
attr_accessor :current_double
|
4
|
+
|
3
5
|
def add_method_signature(a_double, method)
|
4
6
|
simple_double = SimpleDouble.new(a_double)
|
7
|
+
self << simple_double.build_recorded_method_signature(method)
|
8
|
+
end
|
5
9
|
|
6
|
-
|
7
|
-
|
8
|
-
method_operator: simple_double.method_operator,
|
9
|
-
method: method.to_s,
|
10
|
-
stack_frame: StackFrame.new(caller(0).detect{|line| line =~ /_spec\.rb/ }))
|
10
|
+
def add_method_signature_with_current_double(method)
|
11
|
+
add_method_signature(current_double, method)
|
11
12
|
end
|
12
13
|
end
|
13
14
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module VerifiedDouble
|
2
|
+
module RSpecMocksSyntaxOverrides
|
3
|
+
def allow(*args)
|
4
|
+
if args[0].is_a?(VerifiedDouble::CanRecordInteractions)
|
5
|
+
VerifiedDouble.registry.current_double = args[0]
|
6
|
+
else
|
7
|
+
VerifiedDouble.registry.current_double = nil
|
8
|
+
end
|
9
|
+
super(*args)
|
10
|
+
end
|
11
|
+
|
12
|
+
def expect(*args)
|
13
|
+
if args[0].is_a?(VerifiedDouble::CanRecordInteractions)
|
14
|
+
VerifiedDouble.registry.current_double = args[0]
|
15
|
+
else
|
16
|
+
VerifiedDouble.registry.current_double = nil
|
17
|
+
end
|
18
|
+
super(*args)
|
19
|
+
end
|
20
|
+
|
21
|
+
def receive(*args)
|
22
|
+
if VerifiedDouble.registry.current_double
|
23
|
+
VerifiedDouble.registry.add_method_signature_with_current_double(args[0])
|
24
|
+
super(*args).tap {|result| result.extend(VerifiedDouble::CanRecordInteractions) }
|
25
|
+
else
|
26
|
+
super(*args)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -6,6 +6,14 @@ module VerifiedDouble
|
|
6
6
|
@internal = internal
|
7
7
|
end
|
8
8
|
|
9
|
+
def build_recorded_method_signature(method)
|
10
|
+
RecordedMethodSignature.new(
|
11
|
+
class_name: class_name,
|
12
|
+
method_operator: method_operator,
|
13
|
+
method: method.to_s)
|
14
|
+
end
|
15
|
+
|
16
|
+
|
9
17
|
def class_name
|
10
18
|
class_double? ? internal.name : internal.instance_variable_get('@name')
|
11
19
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'pry'
|
2
2
|
require 'verified_double'
|
3
|
+
require 'verified_double/rspec_configuration'
|
3
4
|
|
4
5
|
# This file was generated by the `rspec --init` command. Conventionally, all
|
5
6
|
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
@@ -17,8 +18,4 @@ RSpec.configure do |config|
|
|
17
18
|
# the seed, which is printed after each run.
|
18
19
|
# --seed 1234
|
19
20
|
config.order = 'random'
|
20
|
-
|
21
|
-
config.after :suite do
|
22
|
-
VerifiedDouble.report_unverified_signatures(self)
|
23
|
-
end
|
24
21
|
end
|
@@ -17,14 +17,14 @@ describe VerifiedDouble::CanRecordInteractions do
|
|
17
17
|
|
18
18
|
describe "#stub(method)" do
|
19
19
|
it "appends a new method signature with the method to the registry", verifies_contract: 'Object#stubbed_fake_to_s()' do
|
20
|
-
a_double.
|
20
|
+
allow(a_double).to receive(:stubbed_fake_to_s)
|
21
21
|
expect(VerifiedDouble.registry.last.method).to eq('stubbed_fake_to_s')
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
25
|
describe "#with(*args)" do
|
26
26
|
it "sets the args of the last method signature", verifies_contract: 'Object#fake_to_s(Symbol, Symbol)' do
|
27
|
-
a_double.
|
27
|
+
expect(a_double).to receive(:fake_to_s).with(:arg_1, :arg_2)
|
28
28
|
|
29
29
|
expect(VerifiedDouble.registry.last.args).to be_all{|arg| arg.is_a?(VerifiedDouble::MethodSignature::Value) }
|
30
30
|
expect(VerifiedDouble.registry.last.args.map(&:content)).to eq([:arg_1, :arg_2])
|
@@ -35,7 +35,7 @@ describe VerifiedDouble::CanRecordInteractions do
|
|
35
35
|
|
36
36
|
describe "#and_return(return_value)" do
|
37
37
|
it "sets the return value of the last method signature", verifies_contract: 'Object#fake_to_s(Symbol, Symbol)=>Symbol' do
|
38
|
-
a_double.
|
38
|
+
expect(a_double).to receive(:fake_to_s).with(:arg_1, :arg_2).and_return(:return_value)
|
39
39
|
|
40
40
|
expect(VerifiedDouble.registry.last.return_values).to have(1).return_value
|
41
41
|
expect(VerifiedDouble.registry.last.return_values.first).to be_a(VerifiedDouble::MethodSignature::Value)
|
@@ -15,28 +15,21 @@ describe VerifiedDouble::MethodSignaturesReport do
|
|
15
15
|
let(:method_signature_2) {
|
16
16
|
VerifiedDouble::MethodSignature.new(class_name: 'Object', method_operator: '#', method: 'inspect') }
|
17
17
|
|
18
|
+
let(:registry){
|
19
|
+
double(:registry, 'current_double' => nil, 'current_double=' => nil) }
|
20
|
+
|
18
21
|
let(:verified_double_module){
|
19
22
|
stub_const('VerifiedDouble', Class.new, transfer_nested_constants: true) }
|
20
23
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
expect(subject.set_registered_signatures.registered_signatures.to_a).to eq(
|
28
|
-
[method_signature_1, method_signature_2])
|
29
|
-
end
|
30
|
-
end
|
24
|
+
it "sets distinct signatures from the registry" do
|
25
|
+
verified_double_module
|
26
|
+
.should_receive(:registry)
|
27
|
+
.at_least(:once)
|
28
|
+
.and_return(registry)
|
31
29
|
|
32
|
-
|
33
|
-
it "returns distinct method signatures" do
|
34
|
-
verified_double_module
|
35
|
-
.should_receive(:registry)
|
36
|
-
.and_return([method_signature_1, method_signature_1])
|
30
|
+
expect(registry).to receive(:uniq).and_return(registry)
|
37
31
|
|
38
|
-
|
39
|
-
end
|
32
|
+
expect(subject.set_registered_signatures.registered_signatures).to eq(registry)
|
40
33
|
end
|
41
34
|
end
|
42
35
|
|
@@ -66,13 +59,13 @@ describe VerifiedDouble::MethodSignaturesReport do
|
|
66
59
|
.stub_chain(:class, :descendant_filtered_examples)
|
67
60
|
.and_return([example_with_verified_contract_tag, example_without_verified_contract_tag])
|
68
61
|
|
69
|
-
parse_method_signature_service_class
|
70
|
-
.
|
62
|
+
expect(parse_method_signature_service_class)
|
63
|
+
.to receive(:new)
|
71
64
|
.with(example_with_verified_contract_tag.metadata[:verifies_contract])
|
72
65
|
.and_return(parse_method_signature_service)
|
73
66
|
|
74
|
-
parse_method_signature_service
|
75
|
-
.
|
67
|
+
expect(parse_method_signature_service)
|
68
|
+
.to receive(:execute)
|
76
69
|
.and_return(method_signature)
|
77
70
|
|
78
71
|
expect(subject.verified_signatures_from_tags).to eq([method_signature])
|
@@ -83,14 +76,14 @@ describe VerifiedDouble::MethodSignaturesReport do
|
|
83
76
|
.stub_chain(:class, :descendant_filtered_examples)
|
84
77
|
.and_return([example_with_verified_contract_tag, example_with_verified_contract_tag])
|
85
78
|
|
86
|
-
parse_method_signature_service_class
|
87
|
-
.
|
79
|
+
expect(parse_method_signature_service_class)
|
80
|
+
.to receive(:new)
|
88
81
|
.with(example_with_verified_contract_tag.metadata[:verifies_contract])
|
89
82
|
.at_least(:once)
|
90
83
|
.and_return(parse_method_signature_service)
|
91
84
|
|
92
|
-
parse_method_signature_service
|
93
|
-
.
|
85
|
+
expect(parse_method_signature_service)
|
86
|
+
.to receive(:execute)
|
94
87
|
.and_return(method_signature)
|
95
88
|
|
96
89
|
expect(subject.verified_signatures_from_tags).to eq([method_signature])
|
@@ -168,7 +161,7 @@ describe VerifiedDouble::MethodSignaturesReport do
|
|
168
161
|
"2. #{unverified_signatures[1].recommended_verified_signature}",
|
169
162
|
"For more info, check out https://www.relishapp.com/gsmendoza/verified-double." ]
|
170
163
|
|
171
|
-
subject.
|
164
|
+
expect(subject).to receive(:puts).with(lines.join("\n\n"))
|
172
165
|
subject.output_unverified_signatures
|
173
166
|
end
|
174
167
|
end
|
@@ -180,9 +173,17 @@ describe VerifiedDouble::MethodSignaturesReport do
|
|
180
173
|
|
181
174
|
let(:method_signature) { VerifiedDouble::MethodSignature.new }
|
182
175
|
|
176
|
+
let(:registry){
|
177
|
+
double(:registry, 'current_double' => nil, 'current_double=' => nil) }
|
178
|
+
|
183
179
|
it "works" do
|
184
180
|
verified_double_module
|
185
|
-
.should_receive(:
|
181
|
+
.should_receive(:registry)
|
182
|
+
.at_least(:once)
|
183
|
+
.and_return(registry)
|
184
|
+
|
185
|
+
expect(verified_double_module)
|
186
|
+
.to receive(:verified_signatures_from_matchers)
|
186
187
|
.and_return([method_signature])
|
187
188
|
|
188
189
|
expect(subject.set_verified_signatures_from_matchers.verified_signatures_from_matchers)
|
@@ -1,12 +1,12 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe VerifiedDouble::RecordedMethodSignatureRegistry do
|
4
|
+
let(:class_name){ 'Object' }
|
5
|
+
let(:a_double){ double(class_name) }
|
6
|
+
let(:method){ :fake_to_s }
|
7
|
+
|
4
8
|
describe "#add_method_signature(a_double, method)" do
|
5
|
-
|
6
|
-
let(:a_double){ double(class_name) }
|
7
|
-
let(:method){ :fake_to_s }
|
8
|
-
|
9
|
-
it "adds a method signture matching the method to itself" do
|
9
|
+
it "adds a method signature for the method of the double" do
|
10
10
|
expect(subject).to be_empty
|
11
11
|
|
12
12
|
subject.add_method_signature(a_double, method)
|
@@ -17,11 +17,21 @@ describe VerifiedDouble::RecordedMethodSignatureRegistry do
|
|
17
17
|
expect(method_signature.method_operator).to eq('#')
|
18
18
|
expect(method_signature.method).to eq(method.to_s)
|
19
19
|
end
|
20
|
+
end
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
describe "#add_method_signature_with_current_double(method)" do
|
23
|
+
it "adds a method signature for the method of the current double" do
|
24
|
+
subject.current_double = a_double
|
25
|
+
|
26
|
+
expect(subject).to be_empty
|
27
|
+
|
28
|
+
subject.add_method_signature_with_current_double(method)
|
29
|
+
|
30
|
+
expect(subject).to have(1).method_signature
|
31
|
+
method_signature = subject[0]
|
32
|
+
expect(method_signature.class_name).to eq(class_name)
|
33
|
+
expect(method_signature.method_operator).to eq('#')
|
34
|
+
expect(method_signature.method).to eq(method.to_s)
|
25
35
|
end
|
26
36
|
end
|
27
37
|
end
|
@@ -4,12 +4,9 @@ describe VerifiedDouble::RecordedMethodSignature do
|
|
4
4
|
class Dummy
|
5
5
|
end
|
6
6
|
|
7
|
-
let(:stack_frame_string){ "./lib/verified_double/method_signature.rb:7:in `block in initialize'" }
|
8
|
-
|
9
7
|
let(:attributes){
|
10
8
|
{ class_name: 'Dummy',
|
11
|
-
method_operator: '#'
|
12
|
-
stack_frame: VerifiedDouble::StackFrame.new(stack_frame_string) } }
|
9
|
+
method_operator: '#' } }
|
13
10
|
|
14
11
|
subject {
|
15
12
|
described_class.new(attributes).tap {|method_signature|
|
@@ -17,7 +14,14 @@ describe VerifiedDouble::RecordedMethodSignature do
|
|
17
14
|
|
18
15
|
describe "#to_s" do
|
19
16
|
it "includes the stack frame" do
|
20
|
-
expect(subject.to_s).to include(
|
17
|
+
expect(subject.to_s).to include(subject.stack_frame.to_s)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "#initialize" do
|
22
|
+
it "set the stack frame of the signature's caller" do
|
23
|
+
expect(subject.stack_frame.to_s)
|
24
|
+
.to include("./spec/verified_double/recorded_method_signature_spec.rb")
|
21
25
|
end
|
22
26
|
end
|
23
27
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe VerifiedDouble::RSpecMocksSyntaxOverrides do
|
4
|
+
let(:some_method){ 'fake_to_s' }
|
5
|
+
let(:some_result){ 'result' }
|
6
|
+
|
7
|
+
describe "#expect(*args)" do
|
8
|
+
context "where the double arg records VerifiedDouble interactions" do
|
9
|
+
let(:a_double) { VerifiedDouble.of_instance('Object') }
|
10
|
+
|
11
|
+
it "sets the registry's current_double to the first arg", verifies_contract: 'Object#fake_to_s()=>String' do
|
12
|
+
expect(VerifiedDouble.registry.current_double).to_not eq(a_double)
|
13
|
+
expect(a_double)
|
14
|
+
VerifiedDouble.registry.current_double.should eq(a_double)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context "where the double arg does not record VerifiedDouble interactions" do
|
19
|
+
let(:a_double) { double('Object') }
|
20
|
+
|
21
|
+
it "doesn't set the registry's current_double" do
|
22
|
+
expect(VerifiedDouble.registry.current_double).to_not equal(a_double)
|
23
|
+
expect(a_double)
|
24
|
+
expect(VerifiedDouble.registry.current_double).to be_nil
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe "#allow(*args)" do
|
30
|
+
context "where the double arg records VerifiedDouble interactions" do
|
31
|
+
let(:a_double) { VerifiedDouble.of_instance('Object') }
|
32
|
+
|
33
|
+
it "sets the registry's current_double to the first arg", verifies_contract: 'Object#fake_to_s()=>String' do
|
34
|
+
expect(VerifiedDouble.registry.last).to_not eq(a_double)
|
35
|
+
allow(a_double)
|
36
|
+
VerifiedDouble.registry.current_double.should eq(a_double)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "where the double arg does not record VerifiedDouble interactions" do
|
41
|
+
let(:a_double) { double('Object') }
|
42
|
+
|
43
|
+
it "clears registry's current_double" do
|
44
|
+
expect(VerifiedDouble.registry.current_double).to_not equal(a_double)
|
45
|
+
allow(a_double)
|
46
|
+
expect(VerifiedDouble.registry.current_double).to be_nil
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "#receive(*args)" do
|
52
|
+
context "where the current double is recording VerifiedDouble interactions" do
|
53
|
+
let(:a_double) { VerifiedDouble.of_instance('Object') }
|
54
|
+
|
55
|
+
it "adds the first arg as a method signature for the current double" do
|
56
|
+
expect(a_double).to receive(some_method).and_return(some_result)
|
57
|
+
|
58
|
+
method_signature = VerifiedDouble.registry.last
|
59
|
+
expect(method_signature).to be_a(VerifiedDouble::MethodSignature)
|
60
|
+
expect(method_signature.method).to eq(some_method)
|
61
|
+
expect(method_signature.return_values.map(&:content)).to eq([some_result])
|
62
|
+
|
63
|
+
a_double.fake_to_s
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context "where the current double is not recording VerifiedDouble interactions" do
|
68
|
+
let(:a_double) { double('Object') }
|
69
|
+
|
70
|
+
it "doesn't add a method signature for the method" do
|
71
|
+
registry_size = VerifiedDouble.registry.size
|
72
|
+
expect(a_double).to receive(some_method).and_return(some_result)
|
73
|
+
|
74
|
+
expect(VerifiedDouble.registry.size).to eq(registry_size)
|
75
|
+
a_double.fake_to_s
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -54,4 +54,16 @@ describe VerifiedDouble::SimpleDouble do
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
end
|
57
|
+
|
58
|
+
describe "#build_record_method_signature(method)" do
|
59
|
+
let(:method){ :fake_to_s }
|
60
|
+
subject { simple_instance_double.build_recorded_method_signature(method) }
|
61
|
+
|
62
|
+
it "returns a method signature for the method of the double" do
|
63
|
+
expect(subject).to be_a(VerifiedDouble::RecordedMethodSignature)
|
64
|
+
expect(subject.class_name).to eq(class_name)
|
65
|
+
expect(subject.method_operator).to eq('#')
|
66
|
+
expect(subject.method).to eq(method.to_s)
|
67
|
+
end
|
68
|
+
end
|
57
69
|
end
|
@@ -48,6 +48,33 @@ describe VerifiedDouble do
|
|
48
48
|
it "stubs the methods of the instance" do
|
49
49
|
expect(subject.send(stubbed_method)).to eq(assumed_output)
|
50
50
|
end
|
51
|
+
|
52
|
+
it "inserts a new method signature with the method as the FIRST item of the registry" do
|
53
|
+
# so that it doesn't interfere with the current VerifiedDouble.registry.last
|
54
|
+
subject
|
55
|
+
expect(VerifiedDouble.registry.first).to be_a(VerifiedDouble::RecordedMethodSignature)
|
56
|
+
expect(VerifiedDouble.registry.first.method).to eq(stubbed_method.to_s)
|
57
|
+
end
|
58
|
+
|
59
|
+
context "where the double is an value of an expectation" do
|
60
|
+
let(:parent){ VerifiedDouble.of_instance('Object') }
|
61
|
+
let(:parent_method){ :parent_method }
|
62
|
+
let(:parent_output){ :parent_output }
|
63
|
+
|
64
|
+
it "should not interfere with the method signature recording of the expectation", verifies_contract: 'Object#parent_method(Object)=>Symbol' do
|
65
|
+
expect(parent).to receive(parent_method).with(subject).and_return(parent_output)
|
66
|
+
|
67
|
+
parent_method_signature =
|
68
|
+
VerifiedDouble.registry
|
69
|
+
.select{|s|
|
70
|
+
s.args[0].try(:content) == subject &&
|
71
|
+
s.return_values[0].try(:content) == parent_output }
|
72
|
+
|
73
|
+
expect(parent_method_signature).to be_present
|
74
|
+
|
75
|
+
parent.send(:parent_method, subject)
|
76
|
+
end
|
77
|
+
end
|
51
78
|
end
|
52
79
|
end
|
53
80
|
|
@@ -79,7 +106,7 @@ describe VerifiedDouble do
|
|
79
106
|
.stub_chain(:class, :descendant_filtered_examples)
|
80
107
|
.and_return([])
|
81
108
|
|
82
|
-
method_signatures_report_class.
|
109
|
+
expect(method_signatures_report_class).to receive(:new).and_return(method_signatures_report)
|
83
110
|
|
84
111
|
actions = [
|
85
112
|
:set_registered_signatures,
|
@@ -90,8 +117,8 @@ describe VerifiedDouble do
|
|
90
117
|
:output_unverified_signatures]
|
91
118
|
|
92
119
|
actions.each do |action|
|
93
|
-
method_signatures_report
|
94
|
-
.
|
120
|
+
expect(method_signatures_report)
|
121
|
+
.to receive(action)
|
95
122
|
.and_return(method_signatures_report)
|
96
123
|
end
|
97
124
|
|
metadata
CHANGED
@@ -2,14 +2,14 @@
|
|
2
2
|
name: verified_double
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.
|
5
|
+
version: 0.4.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- George Mendoza
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-07-
|
12
|
+
date: 2013-07-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
type: :runtime
|
@@ -128,6 +128,8 @@ files:
|
|
128
128
|
- lib/verified_double/parse_method_signature.rb
|
129
129
|
- lib/verified_double/recorded_method_signature.rb
|
130
130
|
- lib/verified_double/recorded_method_signature_registry.rb
|
131
|
+
- lib/verified_double/rspec_configuration.rb
|
132
|
+
- lib/verified_double/rspec_mocks_syntax_overrides.rb
|
131
133
|
- lib/verified_double/simple_double.rb
|
132
134
|
- lib/verified_double/stack_frame.rb
|
133
135
|
- lib/verified_double/version.rb
|
@@ -144,6 +146,7 @@ files:
|
|
144
146
|
- spec/verified_double/parse_method_signature_spec.rb
|
145
147
|
- spec/verified_double/recorded_method_signature_registry_spec.rb
|
146
148
|
- spec/verified_double/recorded_method_signature_spec.rb
|
149
|
+
- spec/verified_double/rspec_mocks_syntax_overrides_spec.rb
|
147
150
|
- spec/verified_double/simple_double_spec.rb
|
148
151
|
- spec/verified_double/stack_frame_spec.rb
|
149
152
|
- spec/verified_double_spec.rb
|
@@ -196,6 +199,7 @@ test_files:
|
|
196
199
|
- spec/verified_double/parse_method_signature_spec.rb
|
197
200
|
- spec/verified_double/recorded_method_signature_registry_spec.rb
|
198
201
|
- spec/verified_double/recorded_method_signature_spec.rb
|
202
|
+
- spec/verified_double/rspec_mocks_syntax_overrides_spec.rb
|
199
203
|
- spec/verified_double/simple_double_spec.rb
|
200
204
|
- spec/verified_double/stack_frame_spec.rb
|
201
205
|
- spec/verified_double_spec.rb
|