rspec-fire 1.1.3 → 1.2.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/Gemfile +1 -1
- data/HISTORY +5 -0
- data/README.md +1 -1
- data/lib/rspec/fire.rb +58 -30
- data/rspec-fire.gemspec +1 -1
- data/spec/fire_double_spec.rb +70 -40
- metadata +3 -3
data/Gemfile
CHANGED
data/HISTORY
CHANGED
@@ -41,3 +41,8 @@
|
|
41
41
|
|
42
42
|
1.1.3 - 3 September 2012
|
43
43
|
* Use __send__ in case classes have overriden it. (#25)
|
44
|
+
|
45
|
+
1.2.0 - 2 June 2013
|
46
|
+
* Support `expect` syntax.
|
47
|
+
* Better naming in the API: `instance_double` and `class_double`. Deprecate
|
48
|
+
`fire_double` and `fire_class_double`.
|
data/README.md
CHANGED
@@ -87,7 +87,7 @@ Run your specs:
|
|
87
87
|
rspec spec/user_spec.rb
|
88
88
|
|
89
89
|
# Will fail if EmailNotifier#notify method is not defined
|
90
|
-
rspec -Ilib
|
90
|
+
rspec -Ilib -remail_notifier.rb spec/user_spec.rb
|
91
91
|
|
92
92
|
Method presence/absence is checked, and if a `with` is provided then so is
|
93
93
|
arity.
|
data/lib/rspec/fire.rb
CHANGED
@@ -159,9 +159,13 @@ module RSpec
|
|
159
159
|
|
160
160
|
protected
|
161
161
|
|
162
|
+
def expect(value)
|
163
|
+
::RSpec::Expectations::ExpectationTarget.new(value)
|
164
|
+
end
|
165
|
+
|
162
166
|
def ensure_arity(actual)
|
163
167
|
@double.with_doubled_class do |klass|
|
164
|
-
klass.__send__(@method_finder, @sym).
|
168
|
+
expect(klass.__send__(@method_finder, @sym)).to support_arity(actual)
|
165
169
|
end
|
166
170
|
end
|
167
171
|
|
@@ -171,7 +175,6 @@ module RSpec
|
|
171
175
|
end
|
172
176
|
|
173
177
|
module FireDoublable
|
174
|
-
extend RSpec::Matchers::DSL
|
175
178
|
include RecursiveConstMethods
|
176
179
|
|
177
180
|
def should_receive(method_name)
|
@@ -271,39 +274,48 @@ module RSpec
|
|
271
274
|
end
|
272
275
|
end
|
273
276
|
|
274
|
-
class
|
275
|
-
|
276
|
-
Module.new do
|
277
|
-
extend FireDoublable
|
277
|
+
class FireClassDouble < Module
|
278
|
+
include FireDoublable
|
278
279
|
|
279
|
-
|
280
|
-
|
281
|
-
|
280
|
+
def initialize(doubled_class, stubs = {})
|
281
|
+
@__doubled_class_name = doubled_class
|
282
|
+
@__checked_methods = :public_methods
|
283
|
+
@__method_finder = :method
|
282
284
|
|
283
|
-
|
285
|
+
verify_constant_name if RSpec::Fire.configuration.verify_constant_names?
|
284
286
|
|
285
|
-
|
286
|
-
|
287
|
+
::RSpec::Mocks::TestDouble.extend_onto self,
|
288
|
+
doubled_class, stubs.merge(:__declared_as => "FireClassDouble")
|
287
289
|
|
288
|
-
|
289
|
-
|
290
|
-
|
290
|
+
# This needs to come after `::RSpec::Mocks::TestDouble.extend_onto`
|
291
|
+
# so that it gets precedence...
|
292
|
+
extend StringRepresentations
|
293
|
+
end
|
291
294
|
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
+
def as_stubbed_const(options = {})
|
296
|
+
RSpec::Mocks::ConstantStubber.stub(@__doubled_class_name, self, options)
|
297
|
+
@__original_class = RSpec::Mocks::Constant.original(@__doubled_class_name).original_value
|
295
298
|
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
+
extend AsReplacedConstant
|
300
|
+
self
|
301
|
+
end
|
299
302
|
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
+
def as_replaced_constant(*args)
|
304
|
+
RSpec::Fire::DEPRECATED["as_replaced_constant is deprecated, use as_stubbed_const instead."]
|
305
|
+
as_stubbed_const(*args)
|
306
|
+
end
|
303
307
|
|
304
|
-
|
305
|
-
|
306
|
-
|
308
|
+
def name
|
309
|
+
@__doubled_class_name
|
310
|
+
end
|
311
|
+
|
312
|
+
module StringRepresentations
|
313
|
+
def to_s
|
314
|
+
@__doubled_class_name + " (fire double)"
|
315
|
+
end
|
316
|
+
|
317
|
+
def inspect
|
318
|
+
to_s
|
307
319
|
end
|
308
320
|
end
|
309
321
|
|
@@ -319,16 +331,32 @@ module RSpec
|
|
319
331
|
yield const.original_value if const.stubbed?
|
320
332
|
end
|
321
333
|
|
322
|
-
def
|
334
|
+
def instance_double(*args)
|
323
335
|
FireObjectDouble.new(*args)
|
324
336
|
end
|
325
337
|
|
338
|
+
def class_double(*args)
|
339
|
+
FireClassDouble.new(*args)
|
340
|
+
end
|
341
|
+
|
342
|
+
def fire_double(*args)
|
343
|
+
DEPRECATED["fire_double is deprecated, use instance_double instead."]
|
344
|
+
instance_double(*args)
|
345
|
+
end
|
346
|
+
|
326
347
|
def fire_class_double(*args)
|
327
|
-
|
348
|
+
DEPRECATED["fire_class_double is deprecated, use class_double instead."]
|
349
|
+
class_double(*args)
|
328
350
|
end
|
329
351
|
|
330
352
|
def fire_replaced_class_double(*args)
|
331
|
-
|
353
|
+
DEPRECATED["fire_replaced_class_double is deprecated, use class_double with as_stubbed_const instead."]
|
354
|
+
class_double(*args).as_stubbed_const
|
332
355
|
end
|
356
|
+
|
357
|
+
DEPRECATED = lambda do |msg|
|
358
|
+
Kernel.warn caller[2] + ": " + msg
|
359
|
+
end
|
360
|
+
|
333
361
|
end
|
334
362
|
end
|
data/rspec-fire.gemspec
CHANGED
data/spec/fire_double_spec.rb
CHANGED
@@ -60,7 +60,7 @@ end
|
|
60
60
|
|
61
61
|
shared_examples_for 'a fire-enhanced double method' do
|
62
62
|
describe 'doubled class is not loaded' do
|
63
|
-
let(:doubled_object) {
|
63
|
+
let(:doubled_object) { instance_double("UnloadedObject") }
|
64
64
|
should_allow(:undefined_method)
|
65
65
|
should_allow('undefined_method')
|
66
66
|
end
|
@@ -174,7 +174,7 @@ shared_examples_for 'a fire-enhanced double' do
|
|
174
174
|
|
175
175
|
context "RSpec's hash shortcut syntax" do
|
176
176
|
context 'doubled class is not loaded' do
|
177
|
-
let(:doubled_object) {
|
177
|
+
let(:doubled_object) { instance_double("UnloadedObject") }
|
178
178
|
should_allow(:undefined_method => 123)
|
179
179
|
end
|
180
180
|
|
@@ -187,29 +187,47 @@ shared_examples_for 'a fire-enhanced double' do
|
|
187
187
|
end
|
188
188
|
end
|
189
189
|
|
190
|
-
describe '#
|
191
|
-
let(:doubled_object) {
|
190
|
+
describe '#instance_double' do
|
191
|
+
let(:doubled_object) { instance_double("TestObject") }
|
192
192
|
|
193
193
|
it_should_behave_like 'a fire-enhanced double'
|
194
|
-
it_should_behave_like "verifying named constants", :
|
194
|
+
it_should_behave_like "verifying named constants", :instance_double
|
195
195
|
|
196
196
|
it 'allows stubs to be passed as a hash' do
|
197
|
-
double =
|
197
|
+
double = instance_double("TestObject", :defined_method => 17)
|
198
198
|
double.defined_method.should eq(17)
|
199
199
|
end
|
200
200
|
|
201
201
|
it 'does not prevent stubbing methods on an unloaded nested constant with a name that matches a top-level constant' do
|
202
|
-
double =
|
202
|
+
double = instance_double("TestObject::Hash")
|
203
203
|
double.stub(:foo).and_return("bar")
|
204
204
|
double.foo.should eq("bar")
|
205
205
|
end
|
206
|
+
|
207
|
+
def with_isolated_syntax_change
|
208
|
+
original_syntax = ::RSpec::Matchers.configuration.syntax
|
209
|
+
yield
|
210
|
+
ensure
|
211
|
+
::RSpec::Matchers.configuration.syntax = original_syntax
|
212
|
+
end
|
213
|
+
|
214
|
+
it 'works when the `should` syntax is disabled' do
|
215
|
+
with_isolated_syntax_change do
|
216
|
+
::RSpec::Matchers.configuration.syntax = :expect
|
217
|
+
expect(5).not_to respond_to(:should, :should_not)
|
218
|
+
|
219
|
+
double = instance_double("TestObject")
|
220
|
+
double.should_receive(:defined_method_one_arg).with(8)
|
221
|
+
double.defined_method_one_arg(8)
|
222
|
+
end
|
223
|
+
end
|
206
224
|
end
|
207
225
|
|
208
|
-
describe '#
|
209
|
-
let(:doubled_object) {
|
226
|
+
describe '#class_double' do
|
227
|
+
let(:doubled_object) { class_double("TestClass") }
|
210
228
|
|
211
229
|
it_should_behave_like 'a fire-enhanced double'
|
212
|
-
it_should_behave_like "verifying named constants", :
|
230
|
+
it_should_behave_like "verifying named constants", :class_double
|
213
231
|
|
214
232
|
it 'uses a module for the doubled object so that it supports nested constants like a real class' do
|
215
233
|
doubled_object.should be_a(Module)
|
@@ -232,7 +250,7 @@ describe '#fire_class_double' do
|
|
232
250
|
end
|
233
251
|
|
234
252
|
it 'allows stubs to be specified as a hash' do
|
235
|
-
double =
|
253
|
+
double = class_double("SomeClass", :a => 5, :b => 8)
|
236
254
|
double.a.should eq(5)
|
237
255
|
double.b.should eq(8)
|
238
256
|
end
|
@@ -242,7 +260,7 @@ describe '#fire_class_double' do
|
|
242
260
|
mod.stub(:use)
|
243
261
|
expect { mod.use }.to raise_error(/private method `use' called/)
|
244
262
|
|
245
|
-
fire_double =
|
263
|
+
fire_double = class_double("TestClass")
|
246
264
|
fire_double.stub(:use)
|
247
265
|
fire_double.use # should not raise an error
|
248
266
|
end if defined?(::RSpec::Mocks::TestDouble)
|
@@ -252,8 +270,8 @@ def reset_rspec_mocks
|
|
252
270
|
::RSpec::Mocks.space.reset_all
|
253
271
|
end
|
254
272
|
|
255
|
-
describe '
|
256
|
-
let(:doubled_object) {
|
273
|
+
describe '.as_stubbed_const (for an existing class)' do
|
274
|
+
let(:doubled_object) { class_double("TestClass").as_stubbed_const }
|
257
275
|
|
258
276
|
it_should_behave_like 'a fire-enhanced double'
|
259
277
|
|
@@ -266,40 +284,34 @@ describe '#fire_replaced_class_double (for an existing class)' do
|
|
266
284
|
end
|
267
285
|
|
268
286
|
it 'supports transferring nested constants to the double' do
|
269
|
-
|
287
|
+
class_double("TestClass").as_stubbed_const(:transfer_nested_constants => true)
|
270
288
|
TestClass::M.should eq(:m)
|
271
289
|
TestClass::N.should eq(:n)
|
272
290
|
end
|
273
291
|
|
274
|
-
def use_doubles(
|
275
|
-
|
276
|
-
|
292
|
+
def use_doubles(class_double_obj, instance_double_obj)
|
293
|
+
instance_double_obj.should_receive(:defined_method).and_return(3)
|
294
|
+
class_double_obj.should_receive(:defined_method).and_return(4)
|
277
295
|
|
278
|
-
|
279
|
-
|
296
|
+
instance_double_obj.defined_method.should eq(3)
|
297
|
+
class_double_obj.defined_method.should eq(4)
|
280
298
|
|
281
|
-
expect {
|
282
|
-
expect {
|
299
|
+
expect { instance_double_obj.should_receive(:undefined_method) }.to fail_matching("does not implement")
|
300
|
+
expect { class_double_obj.should_receive(:undefined_method) }.to fail_matching("does not implement")
|
283
301
|
end
|
284
302
|
|
285
303
|
it 'can be used after a declared fire_double for the same class' do
|
286
|
-
instance_double
|
287
|
-
class_double = fire_replaced_class_double("TestClass")
|
288
|
-
|
289
|
-
use_doubles class_double, instance_double
|
304
|
+
use_doubles instance_double("TestClass"), class_double("TestClass")
|
290
305
|
end
|
291
306
|
|
292
307
|
it 'can be used before a declared fire_double for the same class' do
|
293
|
-
class_double
|
294
|
-
instance_double = fire_double("TestClass")
|
295
|
-
|
296
|
-
use_doubles class_double, instance_double
|
308
|
+
use_doubles class_double("TestClass"), instance_double("TestClass")
|
297
309
|
end
|
298
310
|
end
|
299
311
|
|
300
|
-
describe '
|
312
|
+
describe '.as_stubbed_const (for a non-existant class)' do
|
301
313
|
it 'allows any method to be mocked' do
|
302
|
-
double =
|
314
|
+
double = class_double("A::B::C").as_stubbed_const
|
303
315
|
double.should_receive(:foo).with("a").and_return(:bar)
|
304
316
|
A::B::C.foo("a").should eq(:bar)
|
305
317
|
end
|
@@ -313,17 +325,13 @@ describe '#fire_replaced_class_double (for a non-existant class)' do
|
|
313
325
|
end
|
314
326
|
|
315
327
|
it 'can be used after a declared fire_double for the same class' do
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
use_doubles class_double, instance_double
|
328
|
+
use_doubles class_double("A::B::C").as_stubbed_const,
|
329
|
+
instance_double("A::B::C")
|
320
330
|
end
|
321
331
|
|
322
332
|
it 'can be used before a declared fire_double for the same class' do
|
323
|
-
class_double
|
324
|
-
|
325
|
-
|
326
|
-
use_doubles class_double, instance_double
|
333
|
+
use_doubles class_double("A::B::C").as_stubbed_const,
|
334
|
+
instance_double("A::B::C")
|
327
335
|
end
|
328
336
|
end
|
329
337
|
|
@@ -409,3 +417,25 @@ describe RSpec::Fire::SupportArityMatcher do
|
|
409
417
|
end
|
410
418
|
end
|
411
419
|
end
|
420
|
+
|
421
|
+
describe 'deprecation' do
|
422
|
+
specify '#fire_double warns user of deprecated usage' do
|
423
|
+
Kernel.should_receive(:warn)
|
424
|
+
fire_double("TestClass")
|
425
|
+
end
|
426
|
+
|
427
|
+
specify '#fire_class_double warns user of deprecated usage' do
|
428
|
+
Kernel.should_receive(:warn)
|
429
|
+
fire_class_double("TestClass")
|
430
|
+
end
|
431
|
+
|
432
|
+
specify '#fire_replaced_class_double warns user of deprecated usage' do
|
433
|
+
Kernel.should_receive(:warn)
|
434
|
+
fire_replaced_class_double("TestClass")
|
435
|
+
end
|
436
|
+
|
437
|
+
specify '#fire_replaced_class_double warns user of deprecated usage' do
|
438
|
+
Kernel.should_receive(:warn)
|
439
|
+
class_double("TestClass").as_replaced_constant
|
440
|
+
end
|
441
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec-fire
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-06-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -79,7 +79,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
79
79
|
version: '0'
|
80
80
|
requirements: []
|
81
81
|
rubyforge_project:
|
82
|
-
rubygems_version: 1.8.
|
82
|
+
rubygems_version: 1.8.23
|
83
83
|
signing_key:
|
84
84
|
specification_version: 3
|
85
85
|
summary: More resilient test doubles for RSpec.
|