rspec-mocks 2.99.4 → 3.0.0.beta1
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.
- checksums.yaml +14 -6
- checksums.yaml.gz.sig +2 -0
- data.tar.gz.sig +1 -0
- data/Changelog.md +89 -105
- data/License.txt +1 -0
- data/README.md +77 -57
- data/features/argument_matchers/explicit.feature +5 -5
- data/features/argument_matchers/general_matchers.feature +10 -10
- data/features/argument_matchers/type_matchers.feature +3 -3
- data/features/message_expectations/allow_any_instance_of.feature +1 -1
- data/features/message_expectations/any_instance.feature +27 -5
- data/features/message_expectations/call_original.feature +2 -2
- data/features/message_expectations/expect_message_using_expect.feature +2 -2
- data/features/message_expectations/expect_message_using_should_receive.feature +2 -2
- 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/README.md +3 -0
- data/features/method_stubs/any_instance.feature +11 -11
- data/features/method_stubs/as_null_object.feature +4 -4
- data/features/method_stubs/simple_return_value_with_stub.feature +7 -7
- data/features/method_stubs/stub_chain.feature +3 -3
- data/features/method_stubs/stub_implementation.feature +2 -2
- data/features/method_stubs/to_ary.feature +2 -2
- data/features/mutating_constants/hiding_defined_constant.feature +2 -2
- data/features/mutating_constants/stub_defined_constant.feature +5 -5
- data/features/mutating_constants/stub_undefined_constant.feature +6 -6
- data/features/outside_rspec/configuration.feature +0 -2
- data/features/outside_rspec/standalone.feature +1 -1
- data/features/spies/spy_partial_mock_method.feature +2 -2
- data/features/spies/spy_pure_mock_method.feature +5 -5
- data/features/spies/spy_unstubbed_method.feature +1 -1
- data/features/support/env.rb +10 -1
- data/features/test_frameworks/test_unit.feature +1 -1
- data/features/verifying_doubles/class_doubles.feature +88 -0
- data/features/verifying_doubles/dynamic_classes.feature +72 -0
- data/features/verifying_doubles/introduction.feature +85 -0
- data/features/verifying_doubles/object_doubles.feature +65 -0
- data/features/verifying_doubles/partial_doubles.feature +34 -0
- data/lib/rspec/mocks.rb +8 -34
- data/lib/rspec/mocks/any_instance/chain.rb +4 -34
- data/lib/rspec/mocks/any_instance/expectation_chain.rb +14 -4
- data/lib/rspec/mocks/any_instance/message_chains.rb +27 -12
- data/lib/rspec/mocks/any_instance/recorder.rb +23 -31
- data/lib/rspec/mocks/any_instance/stub_chain.rb +9 -4
- data/lib/rspec/mocks/argument_list_matcher.rb +8 -1
- data/lib/rspec/mocks/argument_matchers.rb +26 -12
- data/lib/rspec/mocks/arity_calculator.rb +66 -0
- data/lib/rspec/mocks/configuration.rb +42 -14
- data/lib/rspec/mocks/error_generator.rb +34 -10
- data/lib/rspec/mocks/example_methods.rb +64 -19
- data/lib/rspec/mocks/extensions/marshal.rb +0 -15
- data/lib/rspec/mocks/framework.rb +4 -4
- data/lib/rspec/mocks/instance_method_stasher.rb +80 -62
- data/lib/rspec/mocks/matchers/have_received.rb +18 -14
- data/lib/rspec/mocks/matchers/receive.rb +29 -7
- data/lib/rspec/mocks/matchers/receive_messages.rb +72 -0
- data/lib/rspec/mocks/message_expectation.rb +95 -148
- data/lib/rspec/mocks/method_double.rb +77 -139
- data/lib/rspec/mocks/method_reference.rb +95 -0
- data/lib/rspec/mocks/mock.rb +1 -1
- data/lib/rspec/mocks/mutate_const.rb +12 -9
- data/lib/rspec/mocks/object_reference.rb +90 -0
- data/lib/rspec/mocks/order_group.rb +49 -7
- data/lib/rspec/mocks/proxy.rb +72 -33
- data/lib/rspec/mocks/proxy_for_nil.rb +2 -2
- data/lib/rspec/mocks/space.rb +13 -18
- data/lib/rspec/mocks/stub_chain.rb +2 -2
- data/lib/rspec/mocks/syntax.rb +61 -36
- data/lib/rspec/mocks/targets.rb +40 -19
- data/lib/rspec/mocks/test_double.rb +12 -56
- data/lib/rspec/mocks/verifying_double.rb +77 -0
- data/lib/rspec/mocks/verifying_message_expecation.rb +60 -0
- data/lib/rspec/mocks/verifying_proxy.rb +151 -0
- data/lib/rspec/mocks/version.rb +1 -1
- data/spec/rspec/mocks/and_call_original_spec.rb +34 -30
- data/spec/rspec/mocks/and_yield_spec.rb +2 -2
- data/spec/rspec/mocks/any_instance/message_chains_spec.rb +1 -1
- data/spec/rspec/mocks/any_instance_spec.rb +53 -260
- data/spec/rspec/mocks/argument_expectation_spec.rb +4 -4
- data/spec/rspec/mocks/arity_calculator_spec.rb +95 -0
- data/spec/rspec/mocks/array_including_matcher_spec.rb +41 -0
- data/spec/rspec/mocks/at_least_spec.rb +4 -32
- data/spec/rspec/mocks/block_return_value_spec.rb +4 -135
- data/spec/rspec/mocks/combining_implementation_instructions_spec.rb +10 -11
- data/spec/rspec/mocks/configuration_spec.rb +79 -0
- data/spec/rspec/mocks/double_spec.rb +10 -78
- data/spec/rspec/mocks/extensions/marshal_spec.rb +0 -8
- data/spec/rspec/mocks/failing_argument_matchers_spec.rb +49 -4
- data/spec/rspec/mocks/instance_method_stasher_spec.rb +20 -3
- data/spec/rspec/mocks/matchers/have_received_spec.rb +74 -0
- data/spec/rspec/mocks/matchers/receive_messages_spec.rb +140 -0
- data/spec/rspec/mocks/matchers/receive_spec.rb +82 -42
- data/spec/rspec/mocks/methods_spec.rb +1 -1
- data/spec/rspec/mocks/{bug_report_830_spec.rb → mock_expectation_error_spec.rb} +4 -3
- data/spec/rspec/mocks/mock_ordering_spec.rb +11 -0
- data/spec/rspec/mocks/mock_space_spec.rb +10 -1
- data/spec/rspec/mocks/mock_spec.rb +26 -82
- data/spec/rspec/mocks/multiple_return_value_spec.rb +1 -1
- data/spec/rspec/mocks/mutate_const_spec.rb +18 -5
- data/spec/rspec/mocks/null_object_mock_spec.rb +6 -4
- data/spec/rspec/mocks/options_hash_spec.rb +3 -3
- data/spec/rspec/mocks/order_group_spec.rb +27 -0
- data/spec/rspec/mocks/partial_mock_spec.rb +101 -1
- data/spec/rspec/mocks/passing_argument_matchers_spec.rb +3 -20
- data/spec/rspec/mocks/record_messages_spec.rb +4 -4
- data/spec/rspec/mocks/serialization_spec.rb +4 -6
- data/spec/rspec/mocks/space_spec.rb +3 -3
- data/spec/rspec/mocks/stub_chain_spec.rb +0 -12
- data/spec/rspec/mocks/stub_spec.rb +23 -44
- data/spec/rspec/mocks/test_double_spec.rb +3 -22
- data/spec/rspec/mocks/verifying_double_spec.rb +327 -0
- data/spec/rspec/mocks/verifying_message_expecation_spec.rb +68 -0
- data/spec/rspec/mocks_spec.rb +16 -39
- data/spec/spec_helper.rb +29 -18
- metadata +131 -86
- metadata.gz.sig +1 -0
- data/features/message_expectations/expect_any_instance_of.feature +0 -27
- data/lib/rspec/mocks/caller_filter.rb +0 -60
- data/lib/rspec/mocks/deprecation.rb +0 -26
- data/lib/rspec/mocks/extensions/instance_exec.rb +0 -34
- data/lib/rspec/mocks/extensions/proc.rb +0 -63
- data/lib/spec/mocks.rb +0 -4
- data/spec/rspec/mocks/and_return_spec.rb +0 -17
- data/spec/rspec/mocks/any_number_of_times_spec.rb +0 -36
- data/spec/rspec/mocks/before_all_spec.rb +0 -74
- data/spec/rspec/mocks/bug_report_10260_spec.rb +0 -8
- data/spec/rspec/mocks/bug_report_10263_spec.rb +0 -27
- data/spec/rspec/mocks/bug_report_11545_spec.rb +0 -32
- data/spec/rspec/mocks/bug_report_496_spec.rb +0 -17
- data/spec/rspec/mocks/bug_report_600_spec.rb +0 -22
- data/spec/rspec/mocks/bug_report_7611_spec.rb +0 -16
- data/spec/rspec/mocks/bug_report_8165_spec.rb +0 -31
- data/spec/rspec/mocks/bug_report_957_spec.rb +0 -22
@@ -3,17 +3,15 @@ require 'spec_helper'
|
|
3
3
|
module RSpec
|
4
4
|
module Mocks
|
5
5
|
describe TestDouble do
|
6
|
-
before { allow_deprecation }
|
7
|
-
|
8
6
|
before(:all) do
|
9
|
-
Module.
|
7
|
+
Module.class_exec do
|
10
8
|
private
|
11
9
|
def use; end
|
12
10
|
end
|
13
11
|
end
|
14
12
|
|
15
13
|
after(:all) do
|
16
|
-
Module.
|
14
|
+
Module.class_exec do
|
17
15
|
undef use
|
18
16
|
end
|
19
17
|
end
|
@@ -30,12 +28,7 @@ module RSpec
|
|
30
28
|
|
31
29
|
it 'sets the test double name when a name is passed' do
|
32
30
|
double = Module.new { TestDouble.extend_onto(self, "MyDouble") }
|
33
|
-
expect { double.foo }.to raise_error(/
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'warns when `extend_onto` is used' do
|
37
|
-
expect_deprecation_with_call_site(__FILE__, __LINE__ + 1, /RSpec::Mocks::TestDouble.extend_onto/)
|
38
|
-
Module.new { TestDouble.extend_onto(self) }
|
31
|
+
expect { double.foo }.to raise_error(/Double "MyDouble" received/)
|
39
32
|
end
|
40
33
|
|
41
34
|
[[:should, :expect], [:expect], [:should]].each do |syntax|
|
@@ -51,18 +44,6 @@ module RSpec
|
|
51
44
|
end
|
52
45
|
end
|
53
46
|
end
|
54
|
-
|
55
|
-
it 'indicates what type of test double it is in error messages' do
|
56
|
-
double = Module.new do
|
57
|
-
TestDouble.extend_onto(self, "A", :__declared_as => "ModuleMock")
|
58
|
-
end
|
59
|
-
expect { double.foo }.to raise_error(/ModuleMock "A"/)
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'is declared as a mock by default' do
|
63
|
-
double = Module.new { TestDouble.extend_onto(self) }
|
64
|
-
expect { double.foo }.to raise_error(/Mock received/)
|
65
|
-
end
|
66
47
|
end
|
67
48
|
end
|
68
49
|
end
|
@@ -0,0 +1,327 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class LoadedClass
|
4
|
+
M = :m
|
5
|
+
N = :n
|
6
|
+
INSTANCE = LoadedClass.new
|
7
|
+
|
8
|
+
def defined_instance_method; end
|
9
|
+
def self.defined_class_method; end
|
10
|
+
|
11
|
+
def respond_to?(method_name)
|
12
|
+
return true if method_name == :dynamic_instance_method
|
13
|
+
super
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.respond_to?(method_name)
|
17
|
+
return true if method_name == :dynamic_class_method
|
18
|
+
super
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.send
|
22
|
+
# fake out!
|
23
|
+
end
|
24
|
+
|
25
|
+
class Nested; end
|
26
|
+
end
|
27
|
+
|
28
|
+
module RSpec
|
29
|
+
module Mocks
|
30
|
+
describe 'verifying doubles' do
|
31
|
+
describe 'instance doubles' do
|
32
|
+
describe 'when doubled class is not loaded' do
|
33
|
+
include_context "with isolated configuration"
|
34
|
+
|
35
|
+
before do
|
36
|
+
RSpec::Mocks.configuration.verify_doubled_constant_names = false
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'allows any instance method to be stubbed' do
|
40
|
+
o = instance_double('NonloadedClass')
|
41
|
+
o.stub(:undefined_instance_method).with(:arg).and_return(true)
|
42
|
+
expect(o.undefined_instance_method(:arg)).to eq(true)
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'allows any instance method to be expected' do
|
46
|
+
o = instance_double("NonloadedClass")
|
47
|
+
|
48
|
+
expect(o).to receive(:undefined_instance_method).
|
49
|
+
with(:arg).
|
50
|
+
and_return(true)
|
51
|
+
|
52
|
+
expect(o.undefined_instance_method(:arg)).to eq(true)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe 'when doubled class is loaded' do
|
57
|
+
include_context "with isolated configuration"
|
58
|
+
|
59
|
+
before do
|
60
|
+
RSpec::Mocks.configuration.verify_doubled_constant_names = true
|
61
|
+
end
|
62
|
+
|
63
|
+
it 'only allows instance methods that exist to be stubbed' do
|
64
|
+
o = instance_double('LoadedClass', :defined_instance_method => 1)
|
65
|
+
expect(o.defined_instance_method).to eq(1)
|
66
|
+
|
67
|
+
prevents { o.stub(:undefined_instance_method) }
|
68
|
+
prevents { o.stub(:defined_class_method) }
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'only allows instance methods that exist to be expected' do
|
72
|
+
o = instance_double('LoadedClass')
|
73
|
+
expect(o).to receive(:defined_instance_method)
|
74
|
+
o.defined_instance_method
|
75
|
+
|
76
|
+
prevents { expect(o).to receive(:undefined_instance_method) }
|
77
|
+
prevents { expect(o).to receive(:defined_class_method) }
|
78
|
+
prevents { o.should_receive(:undefined_instance_method) }
|
79
|
+
prevents { o.should_receive(:defined_class_method) }
|
80
|
+
end
|
81
|
+
|
82
|
+
it 'does not allow dynamic methods to be expected' do
|
83
|
+
# This isn't possible at the moment since an instance of the class
|
84
|
+
# would be required for the verification, and we only have the
|
85
|
+
# class itself.
|
86
|
+
#
|
87
|
+
# This spec exists as "negative" documentation of the absence of a
|
88
|
+
# feature, to highlight the asymmetry from class doubles (that do
|
89
|
+
# support this behaviour).
|
90
|
+
prevents {
|
91
|
+
instance_double('LoadedClass', :dynamic_instance_method => 1)
|
92
|
+
}
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'checks the arity of stubbed methods' do
|
96
|
+
o = instance_double('LoadedClass')
|
97
|
+
prevents {
|
98
|
+
expect(o).to receive(:defined_instance_method).with(:a)
|
99
|
+
}
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'checks that stubbed methods are invoked with the correct arity' do
|
103
|
+
o = instance_double('LoadedClass', :defined_instance_method => 25)
|
104
|
+
expect {
|
105
|
+
o.defined_instance_method(:a)
|
106
|
+
}.to raise_error(ArgumentError)
|
107
|
+
end
|
108
|
+
|
109
|
+
it 'allows class to be specified by constant' do
|
110
|
+
o = instance_double(LoadedClass, :defined_instance_method => 1)
|
111
|
+
expect(o.defined_instance_method).to eq(1)
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'only allows defined methods for null objects' do
|
115
|
+
o = instance_double('LoadedClass').as_null_object
|
116
|
+
|
117
|
+
expect(o.defined_instance_method).to eq(o)
|
118
|
+
prevents { o.undefined_method }
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
it 'cannot be constructed with a non-module object' do
|
123
|
+
expect {
|
124
|
+
instance_double(Object.new)
|
125
|
+
}.to raise_error(/Module or String expected/)
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'can be constructed with a struct' do
|
129
|
+
o = instance_double(Struct.new(:defined_method), :defined_method => 1)
|
130
|
+
|
131
|
+
expect(o.defined_method).to eq(1)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
describe 'class doubles' do
|
136
|
+
describe 'when doubled class is not loaded' do
|
137
|
+
include_context "with isolated configuration"
|
138
|
+
|
139
|
+
before do
|
140
|
+
RSpec::Mocks.configuration.verify_doubled_constant_names = false
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'allows any method to be stubbed' do
|
144
|
+
o = class_double('NonloadedClass')
|
145
|
+
allow(o).to receive(:undefined_instance_method).with(:arg).and_return(1)
|
146
|
+
expect(o.undefined_instance_method(:arg)).to eq(1)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
describe 'when doubled class is loaded' do
|
151
|
+
include_context "with isolated configuration"
|
152
|
+
|
153
|
+
before do
|
154
|
+
RSpec::Mocks.configuration.verify_doubled_constant_names = true
|
155
|
+
end
|
156
|
+
|
157
|
+
it 'only allows class methods that exist to be stubbed' do
|
158
|
+
o = class_double('LoadedClass', :defined_class_method => 1)
|
159
|
+
expect(o.defined_class_method).to eq(1)
|
160
|
+
|
161
|
+
prevents { o.stub(:undefined_instance_method) }
|
162
|
+
prevents { o.stub(:defined_instance_method) }
|
163
|
+
end
|
164
|
+
|
165
|
+
it 'only allows class methods that exist to be expected' do
|
166
|
+
o = class_double('LoadedClass')
|
167
|
+
expect(o).to receive(:defined_class_method)
|
168
|
+
o.defined_class_method
|
169
|
+
|
170
|
+
prevents { expect(o).to receive(:undefined_instance_method) }
|
171
|
+
prevents { expect(o).to receive(:defined_instance_method) }
|
172
|
+
prevents { o.should_receive(:undefined_instance_method) }
|
173
|
+
prevents { o.should_receive(:defined_instance_method) }
|
174
|
+
end
|
175
|
+
|
176
|
+
it 'checks that stubbed methods are invoked with the correct arity' do
|
177
|
+
o = class_double('LoadedClass', :defined_class_method => 1)
|
178
|
+
expect {
|
179
|
+
o.defined_class_method(:a)
|
180
|
+
}.to raise_error(ArgumentError)
|
181
|
+
end
|
182
|
+
|
183
|
+
it 'allows dynamically defined class method stubs with arguments' do
|
184
|
+
o = class_double('LoadedClass')
|
185
|
+
allow(o).to receive(:dynamic_class_method).with(:a) { 1 }
|
186
|
+
|
187
|
+
expect(o.dynamic_class_method(:a)).to eq(1)
|
188
|
+
end
|
189
|
+
|
190
|
+
it 'allows dynamically defined class method mocks with arguments' do
|
191
|
+
o = class_double('LoadedClass')
|
192
|
+
expect(o).to receive(:dynamic_class_method).with(:a)
|
193
|
+
|
194
|
+
o.dynamic_class_method(:a)
|
195
|
+
end
|
196
|
+
|
197
|
+
it 'allows dynamically defined class methods to be expected' do
|
198
|
+
o = class_double('LoadedClass', :dynamic_class_method => 1)
|
199
|
+
expect(o.dynamic_class_method).to eq(1)
|
200
|
+
end
|
201
|
+
|
202
|
+
it 'allows class to be specified by constant' do
|
203
|
+
o = class_double(LoadedClass, :defined_class_method => 1)
|
204
|
+
expect(o.defined_class_method).to eq(1)
|
205
|
+
end
|
206
|
+
|
207
|
+
it 'can replace existing constants for the duration of the test' do
|
208
|
+
original = LoadedClass
|
209
|
+
object = class_double('LoadedClass').as_stubbed_const
|
210
|
+
expect(object).to receive(:defined_class_method)
|
211
|
+
|
212
|
+
expect(LoadedClass).to eq(object)
|
213
|
+
::RSpec::Mocks.space.reset_all
|
214
|
+
expect(LoadedClass).to eq(original)
|
215
|
+
end
|
216
|
+
|
217
|
+
it 'can transfer nested constants to the double' do
|
218
|
+
class_double("LoadedClass").
|
219
|
+
as_stubbed_const(:transfer_nested_constants => true)
|
220
|
+
expect(LoadedClass::M).to eq(:m)
|
221
|
+
expect(LoadedClass::N).to eq(:n)
|
222
|
+
end
|
223
|
+
|
224
|
+
it 'correctly verifies expectations when constant is removed' do
|
225
|
+
dbl1 = class_double(LoadedClass::Nested).as_stubbed_const
|
226
|
+
class_double(LoadedClass).as_stubbed_const
|
227
|
+
|
228
|
+
prevents {
|
229
|
+
expect(dbl1).to receive(:undefined_class_method)
|
230
|
+
}
|
231
|
+
end
|
232
|
+
|
233
|
+
it 'only allows defined methods for null objects' do
|
234
|
+
o = class_double('LoadedClass').as_null_object
|
235
|
+
|
236
|
+
expect(o.defined_class_method).to eq(o)
|
237
|
+
prevents { o.undefined_method }
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
it 'cannot be constructed with a non-module object' do
|
242
|
+
expect {
|
243
|
+
class_double(Object.new)
|
244
|
+
}.to raise_error(/Module or String expected/)
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
describe 'object doubles' do
|
249
|
+
it 'replaces an unloaded constant' do
|
250
|
+
o = object_double("LoadedClass::NOINSTANCE").as_stubbed_const
|
251
|
+
|
252
|
+
expect(LoadedClass::NOINSTANCE).to eq(o)
|
253
|
+
|
254
|
+
expect(o).to receive(:undefined_instance_method)
|
255
|
+
o.undefined_instance_method
|
256
|
+
end
|
257
|
+
|
258
|
+
it 'replaces a constant by name and verifies instances methods' do
|
259
|
+
o = object_double("LoadedClass::INSTANCE").as_stubbed_const
|
260
|
+
|
261
|
+
expect(LoadedClass::INSTANCE).to eq(o)
|
262
|
+
|
263
|
+
prevents { expect(o).to receive(:undefined_instance_method) }
|
264
|
+
prevents { expect(o).to receive(:defined_class_method) }
|
265
|
+
prevents { o.defined_instance_method }
|
266
|
+
|
267
|
+
expect(o).to receive(:defined_instance_method)
|
268
|
+
o.defined_instance_method
|
269
|
+
end
|
270
|
+
|
271
|
+
it 'can create a double that matches the interface of any arbitrary object' do
|
272
|
+
o = object_double(LoadedClass.new)
|
273
|
+
|
274
|
+
prevents { expect(o).to receive(:undefined_instance_method) }
|
275
|
+
prevents { expect(o).to receive(:defined_class_method) }
|
276
|
+
prevents { o.defined_instance_method }
|
277
|
+
|
278
|
+
expect(o).to receive(:defined_instance_method)
|
279
|
+
o.defined_instance_method
|
280
|
+
end
|
281
|
+
|
282
|
+
it 'does not allow transferring constants to an object' do
|
283
|
+
expect {
|
284
|
+
object_double("LoadedClass::INSTANCE").
|
285
|
+
as_stubbed_const(:transfer_nested_constants => true)
|
286
|
+
}.to raise_error(/Cannot transfer nested constants/)
|
287
|
+
end
|
288
|
+
|
289
|
+
it 'does not allow as_stubbed_constant for real objects' do
|
290
|
+
expect {
|
291
|
+
object_double(LoadedClass.new).as_stubbed_const
|
292
|
+
}.to raise_error(/Can not perform constant replacement with an object/)
|
293
|
+
end
|
294
|
+
|
295
|
+
it 'is not a module' do
|
296
|
+
expect(object_double("LoadedClass::INSTANCE")).to_not be_a(Module)
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
300
|
+
|
301
|
+
describe 'when verify_doubled_constant_names config option is set' do
|
302
|
+
include_context "with isolated configuration"
|
303
|
+
|
304
|
+
before do
|
305
|
+
RSpec::Mocks.configuration.verify_doubled_constant_names = true
|
306
|
+
end
|
307
|
+
|
308
|
+
it 'prevents creation of instance doubles for unloaded constants' do
|
309
|
+
expect {
|
310
|
+
instance_double('LoadedClas')
|
311
|
+
}.to raise_error(NameError)
|
312
|
+
end
|
313
|
+
|
314
|
+
it 'prevents creation of class doubles for unloaded constants' do
|
315
|
+
expect {
|
316
|
+
class_double('LoadedClas')
|
317
|
+
}.to raise_error(NameError)
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
321
|
+
it 'can only be named with a string or a module' do
|
322
|
+
expect { instance_double(1) }.to raise_error(ArgumentError)
|
323
|
+
expect { instance_double(nil) }.to raise_error(ArgumentError)
|
324
|
+
end
|
325
|
+
end
|
326
|
+
end
|
327
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module RSpec
|
4
|
+
module Mocks
|
5
|
+
describe VerifyingMessageExpectation do
|
6
|
+
describe '#with' do
|
7
|
+
let(:error_generator) { double.as_null_object }
|
8
|
+
let(:string_module_reference) { DirectModuleReference.new(String) }
|
9
|
+
|
10
|
+
subject {
|
11
|
+
null = double.as_null_object
|
12
|
+
|
13
|
+
described_class.new(error_generator, null, null, null)
|
14
|
+
}
|
15
|
+
|
16
|
+
describe 'when expected method is not loaded' do
|
17
|
+
it 'allows any arguments to be expected' do
|
18
|
+
subject.with(:foo, :bar)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe 'when arity match fails' do
|
23
|
+
it 'raises error' do
|
24
|
+
subject.method_reference = InstanceMethodReference.new(string_module_reference, :replace)
|
25
|
+
expect(error_generator).to receive(:raise_arity_error).
|
26
|
+
with(instance_of(ArityCalculator), 2)
|
27
|
+
|
28
|
+
subject.with("abc123", "xyz987")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe 'when called with arguments' do
|
33
|
+
it 'matches arity against the number of arguments' do
|
34
|
+
subject.method_reference = InstanceMethodReference.new(string_module_reference, :replace)
|
35
|
+
expect(error_generator).not_to receive(:raise_arity_error)
|
36
|
+
|
37
|
+
subject.with("abc123")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe 'when called with any arguments matcher' do
|
42
|
+
it 'does not try to match arity' do
|
43
|
+
subject.method_reference = InstanceMethodReference.new(string_module_reference, :replace)
|
44
|
+
subject.with(any_args)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe 'when called with no arguments matcher' do
|
49
|
+
it 'matches arity to 0' do
|
50
|
+
subject.method_reference = InstanceMethodReference.new(string_module_reference, :replace)
|
51
|
+
expect(error_generator).to receive(:raise_arity_error).
|
52
|
+
with(instance_of(ArityCalculator), 0)
|
53
|
+
|
54
|
+
subject.with(no_args)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe 'when called with no arguments and no block' do
|
59
|
+
it 'raises' do
|
60
|
+
expect {
|
61
|
+
subject.with
|
62
|
+
}.to raise_error(ArgumentError)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
data/spec/rspec/mocks_spec.rb
CHANGED
@@ -2,25 +2,6 @@ require "spec_helper"
|
|
2
2
|
|
3
3
|
describe RSpec::Mocks do
|
4
4
|
describe "::setup" do
|
5
|
-
it "prints a deprecation warning when given a non-rspec host" do
|
6
|
-
o = Object.new
|
7
|
-
expect(RSpec).to receive(:deprecate).with(
|
8
|
-
"The host argument to `RSpec::Mocks.setup`",
|
9
|
-
:replacement=>"`include RSpec::Mocks::ExampleMethods` in #{o}"
|
10
|
-
)
|
11
|
-
RSpec::Mocks::setup(o)
|
12
|
-
end
|
13
|
-
|
14
|
-
it "prints the deprecation warning with the correct line" do
|
15
|
-
expect_deprecation_with_call_site(__FILE__, __LINE__ + 1)
|
16
|
-
RSpec::Mocks::setup(Object.new)
|
17
|
-
end
|
18
|
-
|
19
|
-
it "does not print a deprecation warning when self (the example group) is passed." do
|
20
|
-
expect(RSpec).not_to receive(:deprecate)
|
21
|
-
RSpec::Mocks::setup(self)
|
22
|
-
end
|
23
|
-
|
24
5
|
context "with an existing Mock::Space" do
|
25
6
|
before do
|
26
7
|
@orig_space = RSpec::Mocks::space
|
@@ -31,12 +12,20 @@ describe RSpec::Mocks do
|
|
31
12
|
end
|
32
13
|
|
33
14
|
it "memoizes the space" do
|
34
|
-
RSpec::Mocks::setup
|
15
|
+
RSpec::Mocks::setup(Object.new)
|
35
16
|
space = RSpec::Mocks::space
|
36
|
-
RSpec::Mocks::setup
|
17
|
+
RSpec::Mocks::setup(Object.new)
|
37
18
|
expect(RSpec::Mocks::space).to equal(space)
|
38
19
|
end
|
39
20
|
end
|
21
|
+
|
22
|
+
context "with no pre-existing Mock::Space" do
|
23
|
+
it "initializes a Mock::Space" do
|
24
|
+
RSpec::Mocks::space = nil
|
25
|
+
RSpec::Mocks::setup(Object.new)
|
26
|
+
expect(RSpec::Mocks::space).not_to be_nil
|
27
|
+
end
|
28
|
+
end
|
40
29
|
end
|
41
30
|
|
42
31
|
describe "::verify" do
|
@@ -51,11 +40,12 @@ describe RSpec::Mocks do
|
|
51
40
|
|
52
41
|
describe "::teardown" do
|
53
42
|
it "delegates to the space" do
|
54
|
-
foo =
|
55
|
-
foo.
|
56
|
-
RSpec::Mocks
|
57
|
-
|
58
|
-
|
43
|
+
foo = double
|
44
|
+
foo.should_receive(:bar)
|
45
|
+
RSpec::Mocks::teardown
|
46
|
+
expect do
|
47
|
+
foo.bar
|
48
|
+
end.to raise_error(/received unexpected message/)
|
59
49
|
end
|
60
50
|
end
|
61
51
|
|
@@ -66,13 +56,6 @@ describe RSpec::Mocks do
|
|
66
56
|
end
|
67
57
|
end
|
68
58
|
|
69
|
-
context 'when requiring spec/mocks (as was valid for rspec 1)' do
|
70
|
-
it 'prints a deprecation warning' do
|
71
|
-
expect(::RSpec).to receive(:deprecate).with("require 'spec/mocks'", :replacement => "require 'rspec/mocks'")
|
72
|
-
load "spec/mocks.rb"
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
59
|
def file_contents_for(lib, filename)
|
77
60
|
# http://rubular.com/r/HYpUMftlG2
|
78
61
|
path = $LOAD_PATH.find { |p| p.match(/\/rspec-#{lib}(-[a-f0-9]+)?\/lib/) }
|
@@ -80,10 +63,4 @@ describe RSpec::Mocks do
|
|
80
63
|
File.read(file)
|
81
64
|
end
|
82
65
|
|
83
|
-
it 'has an up-to-date caller_filter file' do
|
84
|
-
mocks = file_contents_for("mocks", "rspec/mocks/caller_filter.rb")
|
85
|
-
core = file_contents_for("core", "rspec/core/caller_filter.rb")
|
86
|
-
|
87
|
-
expect(mocks).to eq(core)
|
88
|
-
end
|
89
66
|
end
|