rspec-mocks 2.14.6 → 2.99.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +8 -8
  2. data/Changelog.md +20 -14
  3. data/lib/rspec/mocks.rb +6 -2
  4. data/lib/rspec/mocks/any_instance/chain.rb +28 -0
  5. data/lib/rspec/mocks/any_instance/expectation_chain.rb +5 -10
  6. data/lib/rspec/mocks/any_instance/recorder.rb +4 -1
  7. data/lib/rspec/mocks/any_instance/stub_chain.rb +5 -5
  8. data/lib/rspec/mocks/caller_filter.rb +55 -0
  9. data/lib/rspec/mocks/configuration.rb +19 -0
  10. data/lib/rspec/mocks/deprecation.rb +9 -1
  11. data/lib/rspec/mocks/extensions/proc.rb +63 -0
  12. data/lib/rspec/mocks/framework.rb +2 -0
  13. data/lib/rspec/mocks/matchers/receive.rb +2 -9
  14. data/lib/rspec/mocks/message_expectation.rb +92 -22
  15. data/lib/rspec/mocks/method_double.rb +2 -2
  16. data/lib/rspec/mocks/proxy_for_nil.rb +2 -2
  17. data/lib/rspec/mocks/space.rb +4 -5
  18. data/lib/rspec/mocks/stub_chain.rb +1 -1
  19. data/lib/rspec/mocks/syntax.rb +3 -3
  20. data/lib/rspec/mocks/targets.rb +1 -1
  21. data/lib/rspec/mocks/test_double.rb +8 -2
  22. data/lib/rspec/mocks/version.rb +1 -1
  23. data/spec/rspec/mocks/and_yield_spec.rb +1 -1
  24. data/spec/rspec/mocks/any_instance/message_chains_spec.rb +3 -3
  25. data/spec/rspec/mocks/any_instance_spec.rb +233 -84
  26. data/spec/rspec/mocks/argument_expectation_spec.rb +4 -4
  27. data/spec/rspec/mocks/block_return_value_spec.rb +49 -11
  28. data/spec/rspec/mocks/bug_report_10263_spec.rb +1 -1
  29. data/spec/rspec/mocks/bug_report_8165_spec.rb +2 -2
  30. data/spec/rspec/mocks/combining_implementation_instructions_spec.rb +4 -4
  31. data/spec/rspec/mocks/double_spec.rb +7 -0
  32. data/spec/rspec/mocks/failing_argument_matchers_spec.rb +1 -0
  33. data/spec/rspec/mocks/matchers/receive_spec.rb +10 -8
  34. data/spec/rspec/mocks/mock_space_spec.rb +10 -0
  35. data/spec/rspec/mocks/mock_spec.rb +20 -1
  36. data/spec/rspec/mocks/mutate_const_spec.rb +25 -25
  37. data/spec/rspec/mocks/null_object_mock_spec.rb +7 -0
  38. data/spec/rspec/mocks/passing_argument_matchers_spec.rb +4 -2
  39. data/spec/rspec/mocks/record_messages_spec.rb +4 -4
  40. data/spec/rspec/mocks/space_spec.rb +1 -1
  41. data/spec/rspec/mocks/stub_chain_spec.rb +8 -12
  42. data/spec/rspec/mocks/syntax_agnostic_message_matchers_spec.rb +20 -0
  43. data/spec/rspec/mocks/test_double_spec.rb +0 -5
  44. data/spec/rspec/mocks_spec.rb +14 -0
  45. data/spec/spec_helper.rb +27 -0
  46. metadata +7 -5
@@ -147,7 +147,7 @@ module RSpec
147
147
  |used instead; however, it may not work correctly when executed due
148
148
  |to the fact that `self` will be #{@object.superclass}, not #{@object}.
149
149
  |
150
- |Called from: #{caller[2]}
150
+ |Called from: #{CallerFilter.first_non_rspec_line}
151
151
  WARNING
152
152
 
153
153
  @object.superclass.method(@method_name)
@@ -197,7 +197,7 @@ module RSpec
197
197
  # @private
198
198
  def restore_original_visibility
199
199
  return unless object_singleton_class.method_defined?(@method_name) || object_singleton_class.private_method_defined?(@method_name)
200
- object_singleton_class.class_eval(@original_visibility, __FILE__, __LINE__)
200
+ object_singleton_class.class_eval(@original_visibility, __FILE__, __LINE__ + 1)
201
201
  end
202
202
 
203
203
  # @private
@@ -28,8 +28,8 @@ module RSpec
28
28
  private
29
29
 
30
30
  def warn method_name
31
- non_rspec_caller = caller.find { |line| !line.include?('lib/rspec/mocks') }
32
- Kernel.warn("An expectation of :#{method_name} was set on nil. Called from #{non_rspec_caller}. Use allow_message_expectations_on_nil to disable warnings.")
31
+ source = CallerFilter.first_non_rspec_line
32
+ Kernel.warn("An expectation of :#{method_name} was set on nil. Called from #{source}. Use allow_message_expectations_on_nil to disable warnings.")
33
33
  end
34
34
 
35
35
  end
@@ -27,11 +27,6 @@ module RSpec
27
27
  end
28
28
 
29
29
  proxies.clear
30
-
31
- any_instance_recorders.each_value do |recorder|
32
- recorder.stop_all_observation!
33
- end
34
-
35
30
  any_instance_recorders.clear
36
31
  expectation_ordering.clear
37
32
  end
@@ -47,6 +42,10 @@ module RSpec
47
42
  end
48
43
  end
49
44
 
45
+ def remove_any_instance_recorder_for(klass)
46
+ any_instance_recorders.delete(klass.__id__)
47
+ end
48
+
50
49
  def proxies_of(klass)
51
50
  proxies.values.select { |proxy| klass === proxy.object }
52
51
  end
@@ -35,7 +35,7 @@ module RSpec
35
35
  hash = chain.pop
36
36
  hash.each do |k,v|
37
37
  chain << k
38
- blk = lambda { v }
38
+ blk = Proc.new { v }
39
39
  end
40
40
  end
41
41
  return chain.join('.').split('.'), blk
@@ -15,7 +15,7 @@ module RSpec
15
15
  if ::Hash === message_or_hash
16
16
  message_or_hash.each {|message, value| stub_object(object, message).and_return value }
17
17
  else
18
- opts[:expected_from] = caller(1)[1]
18
+ opts[:expected_from] = CallerFilter.first_non_rspec_line
19
19
  ::RSpec::Mocks.allow_message(object, message_or_hash, opts, &block)
20
20
  end
21
21
  end
@@ -27,12 +27,12 @@ module RSpec
27
27
 
28
28
  syntax_host.class_eval do
29
29
  def should_receive(message, opts={}, &block)
30
- opts[:expected_from] ||= caller(1)[0]
30
+ opts[:expected_from] ||= CallerFilter.first_non_rspec_line
31
31
  ::RSpec::Mocks.expect_message(self, message.to_sym, opts, &block)
32
32
  end
33
33
 
34
34
  def should_not_receive(message, &block)
35
- opts = {:expected_from => caller(1)[0]}
35
+ opts = { :expected_from => CallerFilter.first_non_rspec_line }
36
36
  ::RSpec::Mocks.expect_message(self, message.to_sym, opts, &block).never
37
37
  end
38
38
 
@@ -10,7 +10,7 @@ module RSpec
10
10
 
11
11
  def self.delegate_to(matcher_method, options = {})
12
12
  method_name = options.fetch(:from) { :to }
13
- class_eval(<<-RUBY)
13
+ class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
14
14
  def #{method_name}(matcher, &block)
15
15
  unless Matchers::Receive === matcher
16
16
  raise UnsupportedMatcherError, "only the `receive` matcher is supported " +
@@ -27,8 +27,9 @@ module RSpec
27
27
  # are declared, they'll work as expected. If not, the receiver is
28
28
  # returned.
29
29
  def as_null_object
30
- @__null_object = true
31
30
  __mock_proxy.as_null_object
31
+ @__null_object = true
32
+ self
32
33
  end
33
34
 
34
35
  # Returns true if this object has received `as_null_object`
@@ -64,7 +65,12 @@ module RSpec
64
65
  # @private
65
66
  def __build_mock_proxy
66
67
  proxy = Proxy.new(self, @name, @options || {})
67
- proxy.as_null_object if null_object?
68
+
69
+ if null_object?
70
+ proxy.as_null_object
71
+ RSpec.deprecate "Relying on a test double's null-ness to persist between examples"
72
+ end
73
+
68
74
  proxy
69
75
  end
70
76
 
@@ -1,7 +1,7 @@
1
1
  module RSpec
2
2
  module Mocks
3
3
  module Version
4
- STRING = '2.14.6'
4
+ STRING = '2.99.0.beta1'
5
5
  end
6
6
  end
7
7
  end
@@ -25,7 +25,7 @@ describe RSpec::Mocks::Mock do
25
25
  obj.stub(:method_that_accepts_a_block).and_yield do |eval_context|
26
26
  evaluated = true
27
27
  end
28
- expect(evaluated).to be_true
28
+ expect(evaluated).to be true
29
29
  end
30
30
 
31
31
  it "passes an eval context object to the supplied block" do
@@ -4,17 +4,17 @@ describe RSpec::Mocks::AnyInstance::MessageChains do
4
4
  let(:recorder) { double }
5
5
  let(:chains) { RSpec::Mocks::AnyInstance::MessageChains.new }
6
6
  let(:stub_chain) { RSpec::Mocks::AnyInstance::StubChain.new recorder }
7
- let(:expectation_chain) { RSpec::Mocks::AnyInstance::PositiveExpectationChain.new recorder }
7
+ let(:expectation_chain) { RSpec::Mocks::AnyInstance::ExpectationChain.new recorder }
8
8
 
9
9
  it "knows if a method does not have an expectation set on it" do
10
10
  chains.add(:method_name, stub_chain)
11
- expect(chains.has_expectation?(:method_name)).to be_false
11
+ expect(chains.has_expectation?(:method_name)).to be_falsey
12
12
  end
13
13
 
14
14
  it "knows if a method has an expectation set on it" do
15
15
  chains.add(:method_name, stub_chain)
16
16
  chains.add(:method_name, expectation_chain)
17
- expect(chains.has_expectation?(:method_name)).to be_true
17
+ expect(chains.has_expectation?(:method_name)).to be_truthy
18
18
  end
19
19
 
20
20
  it "can remove all stub chains" do
@@ -332,6 +332,12 @@ module RSpec
332
332
  klass.any_instance.unstub(:existing_method)
333
333
  }.to raise_error(RSpec::Mocks::MockExpectationError, 'The method `existing_method` was not stubbed or was already unstubbed')
334
334
  end
335
+
336
+ it 'does not get confused about string vs symbol usage for the message' do
337
+ klass.any_instance.stub(:existing_method) { :stubbed }
338
+ klass.any_instance.unstub("existing_method")
339
+ expect(klass.new.existing_method).to eq(:existing_method_return_value)
340
+ end
335
341
  end
336
342
 
337
343
  context "with #should_not_receive" do
@@ -369,7 +375,6 @@ module RSpec
369
375
  klass.any_instance.should_not_receive(:bar)
370
376
  klass.new.foo
371
377
  RSpec::Mocks.space.verify_all
372
- RSpec::Mocks.space.reset_all
373
378
  end
374
379
  end
375
380
 
@@ -392,36 +397,24 @@ module RSpec
392
397
 
393
398
  it "fails if an instance is created but no invocation occurs" do
394
399
  expect do
395
- begin
396
- klass.any_instance.should_receive(:foo)
397
- klass.new
398
- RSpec::Mocks.space.verify_all
399
- ensure
400
- RSpec::Mocks.space.reset_all
401
- end
400
+ klass.any_instance.should_receive(:foo)
401
+ klass.new
402
+ RSpec::Mocks.space.verify_all
402
403
  end.to raise_error(RSpec::Mocks::MockExpectationError, foo_expectation_error_message)
403
404
  end
404
405
 
405
406
  it "fails if no instance is created" do
406
407
  expect do
407
- begin
408
- klass.any_instance.should_receive(:foo).and_return(1)
409
- RSpec::Mocks.space.verify_all
410
- ensure
411
- RSpec::Mocks.space.reset_all
412
- end
408
+ klass.any_instance.should_receive(:foo).and_return(1)
409
+ RSpec::Mocks.space.verify_all
413
410
  end.to raise_error(RSpec::Mocks::MockExpectationError, foo_expectation_error_message)
414
411
  end
415
412
 
416
413
  it "fails if no instance is created and there are multiple expectations" do
417
414
  expect do
418
- begin
419
- klass.any_instance.should_receive(:foo)
420
- klass.any_instance.should_receive(:bar)
421
- RSpec::Mocks.space.verify_all
422
- ensure
423
- RSpec::Mocks.space.reset_all
424
- end
415
+ klass.any_instance.should_receive(:foo)
416
+ klass.any_instance.should_receive(:bar)
417
+ RSpec::Mocks.space.verify_all
425
418
  end.to raise_error(RSpec::Mocks::MockExpectationError, 'Exactly one instance should have received the following message(s) but didn\'t: bar, foo')
426
419
  end
427
420
 
@@ -483,36 +476,24 @@ module RSpec
483
476
 
484
477
  it "fails if an instance is created but no invocation occurs" do
485
478
  expect do
486
- begin
487
- klass.any_instance.should_receive(:existing_method)
488
- klass.new
489
- RSpec::Mocks.space.verify_all
490
- ensure
491
- RSpec::Mocks.space.reset_all
492
- end
479
+ klass.any_instance.should_receive(:existing_method)
480
+ klass.new
481
+ RSpec::Mocks.space.verify_all
493
482
  end.to raise_error(RSpec::Mocks::MockExpectationError, existing_method_expectation_error_message)
494
483
  end
495
484
 
496
485
  it "fails if no instance is created" do
497
486
  expect do
498
- begin
499
- klass.any_instance.should_receive(:existing_method)
500
- RSpec::Mocks.space.verify_all
501
- ensure
502
- RSpec::Mocks.space.reset_all
503
- end
487
+ klass.any_instance.should_receive(:existing_method)
488
+ RSpec::Mocks.space.verify_all
504
489
  end.to raise_error(RSpec::Mocks::MockExpectationError, existing_method_expectation_error_message)
505
490
  end
506
491
 
507
492
  it "fails if no instance is created and there are multiple expectations" do
508
493
  expect do
509
- begin
510
- klass.any_instance.should_receive(:existing_method)
511
- klass.any_instance.should_receive(:another_existing_method)
512
- RSpec::Mocks.space.verify_all
513
- ensure
514
- RSpec::Mocks.space.reset_all
515
- end
494
+ klass.any_instance.should_receive(:existing_method)
495
+ klass.any_instance.should_receive(:another_existing_method)
496
+ RSpec::Mocks.space.verify_all
516
497
  end.to raise_error(RSpec::Mocks::MockExpectationError, 'Exactly one instance should have received the following message(s) but didn\'t: another_existing_method, existing_method')
517
498
  end
518
499
 
@@ -605,24 +586,16 @@ module RSpec
605
586
 
606
587
  it "fails when no instances are declared" do
607
588
  expect do
608
- begin
609
- klass.any_instance.should_receive(:foo).once
610
- RSpec::Mocks.space.verify_all
611
- ensure
612
- RSpec::Mocks.space.reset_all
613
- end
589
+ klass.any_instance.should_receive(:foo).once
590
+ RSpec::Mocks.space.verify_all
614
591
  end.to raise_error(RSpec::Mocks::MockExpectationError, foo_expectation_error_message)
615
592
  end
616
593
 
617
594
  it "fails when an instance is declared but there are no invocations" do
618
595
  expect do
619
- begin
620
- klass.any_instance.should_receive(:foo).once
621
- klass.new
622
- RSpec::Mocks.space.verify_all
623
- ensure
624
- RSpec::Mocks.space.reset_all
625
- end
596
+ klass.any_instance.should_receive(:foo).once
597
+ klass.new
598
+ RSpec::Mocks.space.verify_all
626
599
  end.to raise_error(RSpec::Mocks::MockExpectationError, foo_expectation_error_message)
627
600
  end
628
601
 
@@ -747,13 +720,9 @@ module RSpec
747
720
 
748
721
  it "fails when the other expecations are not met" do
749
722
  expect do
750
- begin
751
- klass.any_instance.should_receive(:foo).never
752
- klass.any_instance.should_receive(:existing_method).and_return(5)
753
- RSpec::Mocks.space.verify_all
754
- ensure
755
- RSpec::Mocks.space.reset_all
756
- end
723
+ klass.any_instance.should_receive(:foo).never
724
+ klass.any_instance.should_receive(:existing_method).and_return(5)
725
+ RSpec::Mocks.space.verify_all
757
726
  end.to raise_error(RSpec::Mocks::MockExpectationError, existing_method_expectation_error_message)
758
727
  end
759
728
  end
@@ -789,13 +758,9 @@ module RSpec
789
758
 
790
759
  it "fails when the other expecations are not met" do
791
760
  expect do
792
- begin
793
- klass.any_instance.should_receive(:foo).any_number_of_times
794
- klass.any_instance.should_receive(:existing_method).and_return(5)
795
- RSpec::Mocks.space.verify_all
796
- ensure
797
- RSpec::Mocks.space.reset_all
798
- end
761
+ klass.any_instance.should_receive(:foo).any_number_of_times
762
+ klass.any_instance.should_receive(:existing_method).and_return(5)
763
+ RSpec::Mocks.space.verify_all
799
764
  end.to raise_error(RSpec::Mocks::MockExpectationError, existing_method_expectation_error_message)
800
765
  end
801
766
  end
@@ -815,14 +780,13 @@ module RSpec
815
780
  context "public methods" do
816
781
  before(:each) do
817
782
  klass.any_instance.stub(:existing_method).and_return(1)
818
- expect(klass.method_defined?(:__existing_method_without_any_instance__)).to be_true
783
+ expect(klass.method_defined?(:__existing_method_without_any_instance__)).to be true
819
784
  end
820
785
 
821
786
  it "restores the class to its original state after each example when no instance is created" do
822
787
  space.verify_all
823
- space.reset_all
824
788
 
825
- expect(klass.method_defined?(:__existing_method_without_any_instance__)).to be_false
789
+ expect(klass.method_defined?(:__existing_method_without_any_instance__)).to be false
826
790
  expect(klass.new.existing_method).to eq(existing_method_return_value)
827
791
  end
828
792
 
@@ -830,9 +794,8 @@ module RSpec
830
794
  klass.new.existing_method
831
795
 
832
796
  space.verify_all
833
- space.reset_all
834
797
 
835
- expect(klass.method_defined?(:__existing_method_without_any_instance__)).to be_false
798
+ expect(klass.method_defined?(:__existing_method_without_any_instance__)).to be false
836
799
  expect(klass.new.existing_method).to eq(existing_method_return_value)
837
800
  end
838
801
 
@@ -841,9 +804,8 @@ module RSpec
841
804
  klass.new.existing_method
842
805
 
843
806
  space.verify_all
844
- space.reset_all
845
807
 
846
- expect(klass.method_defined?(:__existing_method_without_any_instance__)).to be_false
808
+ expect(klass.method_defined?(:__existing_method_without_any_instance__)).to be false
847
809
  expect(klass.new.existing_method).to eq(existing_method_return_value)
848
810
  end
849
811
  end
@@ -852,15 +814,14 @@ module RSpec
852
814
  before :each do
853
815
  klass.any_instance.stub(:private_method).and_return(:something)
854
816
  space.verify_all
855
- space.reset_all
856
817
  end
857
818
 
858
819
  it "cleans up the backed up method" do
859
- expect(klass.method_defined?(:__existing_method_without_any_instance__)).to be_false
820
+ expect(klass.method_defined?(:__existing_method_without_any_instance__)).to be false
860
821
  end
861
822
 
862
823
  it "restores a stubbed private method after the spec is run" do
863
- expect(klass.private_method_defined?(:private_method)).to be_true
824
+ expect(klass.private_method_defined?(:private_method)).to be true
864
825
  end
865
826
 
866
827
  it "ensures that the restored method behaves as it originally did" do
@@ -875,15 +836,14 @@ module RSpec
875
836
  klass.any_instance.should_receive(:private_method).and_return(:something)
876
837
  klass.new.private_method
877
838
  space.verify_all
878
- space.reset_all
879
839
  end
880
840
 
881
841
  it "cleans up the backed up method" do
882
- expect(klass.method_defined?(:__existing_method_without_any_instance__)).to be_false
842
+ expect(klass.method_defined?(:__existing_method_without_any_instance__)).to be false
883
843
  end
884
844
 
885
845
  it "restores a stubbed private method after the spec is run" do
886
- expect(klass.private_method_defined?(:private_method)).to be_true
846
+ expect(klass.private_method_defined?(:private_method)).to be true
887
847
  end
888
848
 
889
849
  it "ensures that the restored method behaves as it originally did" do
@@ -923,7 +883,6 @@ module RSpec
923
883
  klass.any_instance.should_receive(:existing_method).and_return(Object.new)
924
884
  klass.new.existing_method
925
885
  space.verify_all
926
- space.reset_all
927
886
 
928
887
  expect(klass.new.existing_method).to eq(existing_method_return_value)
929
888
  end
@@ -936,7 +895,6 @@ module RSpec
936
895
  klass.any_instance.stub(:existing_method).and_return(true)
937
896
 
938
897
  RSpec::Mocks.space.verify_all
939
- RSpec::Mocks.space.reset_all
940
898
  expect(klass.new).to respond_to(:existing_method)
941
899
  expect(klass.new.existing_method).to eq(existing_method_return_value)
942
900
  end
@@ -956,6 +914,198 @@ module RSpec
956
914
  end
957
915
  end
958
916
 
917
+ context "passing the receiver to the implementation block" do
918
+ context "when configured to pass the instance" do
919
+ include_context 'with isolated configuration'
920
+ before(:each) do
921
+ RSpec::Mocks.configuration.yield_receiver_to_any_instance_implementation_blocks = true
922
+ end
923
+
924
+ describe "an any instance stub" do
925
+ it "passes the instance as the first arg of the implementation block" do
926
+ instance = klass.new
927
+
928
+ expect { |b|
929
+ klass.any_instance.should_receive(:bees).with(:sup, &b)
930
+ instance.bees(:sup)
931
+ }.to yield_with_args(instance, :sup)
932
+ end
933
+
934
+ it "does not pass the instance to and_call_original" do
935
+ klass = Class.new do
936
+ def call(*args)
937
+ args.first
938
+ end
939
+ end
940
+ klass.any_instance.should_receive(:call).and_call_original
941
+ instance = klass.new
942
+ expect(instance.call(:bees)).to be :bees
943
+ end
944
+ end
945
+
946
+ describe "an any instance expectation" do
947
+ it "doesn't effect with" do
948
+ instance = klass.new
949
+ klass.any_instance.should_receive(:bees).with(:sup)
950
+ instance.bees(:sup)
951
+ end
952
+
953
+ it "passes the instance as the first arg of the implementation block" do
954
+ instance = klass.new
955
+
956
+ expect { |b|
957
+ klass.any_instance.should_receive(:bees).with(:sup, &b)
958
+ instance.bees(:sup)
959
+ }.to yield_with_args(instance, :sup)
960
+ end
961
+ end
962
+ end
963
+
964
+ context "when configured not to pass the instance" do
965
+ include_context 'with isolated configuration'
966
+ before(:each) do
967
+ RSpec::Mocks.configuration.yield_receiver_to_any_instance_implementation_blocks = false
968
+ end
969
+
970
+ describe "an any instance stub" do
971
+ it "does not pass the instance to the implementation block" do
972
+ instance = klass.new
973
+
974
+ expect { |b|
975
+ klass.any_instance.should_receive(:bees).with(:sup, &b)
976
+ instance.bees(:sup)
977
+ }.to yield_with_args(:sup)
978
+ end
979
+
980
+ it "does not cause with to fail when the instance is passed" do
981
+ instance = klass.new
982
+ klass.any_instance.should_receive(:bees).with(:faces)
983
+ instance.bees(:faces)
984
+ end
985
+ end
986
+ end
987
+
988
+ context "by default" do
989
+ def block_regex(line)
990
+ /as the first block argument.*#{__FILE__}:#{line}/m
991
+ end
992
+
993
+ it "is off" do
994
+ expect(RSpec::Mocks.configuration.yield_receiver_to_any_instance_implementation_blocks?).to be false
995
+ end
996
+
997
+ it "will warn about allowances receiving blocks in 3.0" do
998
+ klass = Struct.new(:bees)
999
+
1000
+ expect(RSpec).to receive(:warn_deprecation).with(block_regex(__LINE__ + 1))
1001
+ allow_any_instance_of(klass).to receive(:foo) { |args| }
1002
+ klass.new(:faces).foo
1003
+ end
1004
+
1005
+ it "will warn about expectations receiving blocks in 3.0" do
1006
+ klass = Struct.new(:bees)
1007
+
1008
+ expect(RSpec).to receive(:warn_deprecation).with(block_regex(__LINE__ + 1))
1009
+ expect_any_instance_of(klass).to receive(:foo) { |args| }
1010
+ klass.new(:faces).foo
1011
+ end
1012
+
1013
+ it 'includes the line of the block declaration in the warning, ' +
1014
+ 'even when it is different from the `any_instance` line', :unless => (RUBY_VERSION.to_f < 1.9) do
1015
+ klass = Class.new
1016
+ expect(RSpec).to receive(:warn_deprecation).with(block_regex(__LINE__ + 3))
1017
+ stub = klass.any_instance.stub(:foo)
1018
+
1019
+ stub.with("bar") { |args| }
1020
+ klass.new.foo("bar")
1021
+ end
1022
+
1023
+ it "will warn about expectations receiving blocks with a times restriction" do
1024
+ klass = Struct.new(:bees)
1025
+
1026
+ expect(RSpec).to receive(:warn_deprecation).with(block_regex(__LINE__ + 1))
1027
+ klass.any_instance.should_receive(:foo).exactly(3).times { |a| :some_return_value }
1028
+
1029
+ instance = klass.new(:faces)
1030
+ 3.times { instance.foo }
1031
+ end
1032
+
1033
+ it "will warn about expectations receiving blocks with an argument expectation" do
1034
+ klass = Struct.new(:bees)
1035
+
1036
+ expect(RSpec).to receive(:warn_deprecation).with(block_regex(__LINE__ + 1))
1037
+ klass.any_instance.should_receive(:foo).with(3) { |b| :some_return_value }
1038
+
1039
+ instance = klass.new(:faces)
1040
+ instance.foo(3)
1041
+ end
1042
+
1043
+ it "works with a do end style block" do
1044
+ klass = Struct.new(:bees)
1045
+
1046
+ expect(RSpec).to receive(:warn_deprecation).with(block_regex(__LINE__ + 1))
1047
+ klass.any_instance.should_receive(:foo).with(3) do |a|
1048
+ :some_return_value
1049
+ end
1050
+
1051
+ instance = klass.new(:faces)
1052
+ instance.foo(3)
1053
+ end
1054
+
1055
+ it "won't warn if there is no implementation block on an expectation" do
1056
+ expect(RSpec).not_to receive(:warn_deprecation)
1057
+
1058
+ klass = Struct.new(:bees)
1059
+
1060
+ allow_any_instance_of(klass).to receive(:foo)
1061
+ klass.new(:faces).foo
1062
+ end
1063
+
1064
+ it "won't warn if the implementation block ignores arguments", :if => (RUBY_VERSION.to_f > 1.8) do
1065
+ expect(RSpec).not_to receive(:warn_deprecation)
1066
+
1067
+ klass = Struct.new(:bees)
1068
+ allow_any_instance_of(klass).to receive(:foo) { 5 }
1069
+ klass.new(:faces).foo
1070
+ end
1071
+
1072
+ it "warns if the implementation block accepts a splat" do
1073
+ klass = Struct.new(:bees)
1074
+
1075
+ expect(RSpec).to receive(:warn_deprecation).with(block_regex(__LINE__ + 1))
1076
+ allow_any_instance_of(klass).to receive(:foo) { |*a| 5 }
1077
+
1078
+ klass.new(:faces).foo
1079
+ end
1080
+
1081
+ it "warns if it the implementation is a lambda that expects no arguments" do
1082
+ klass = Struct.new(:bees)
1083
+
1084
+ expect(RSpec).to receive(:warn_deprecation).with(block_regex(__LINE__ + 1))
1085
+ allow_any_instance_of(klass).to receive(:foo, &lambda { 5 })
1086
+
1087
+ klass.new(:faces).foo
1088
+ end
1089
+
1090
+ it "will warn about stubs receiving blocks in 3.0" do
1091
+ klass = Struct.new(:bees)
1092
+
1093
+ expect(RSpec).to receive(:warn_deprecation).with(block_regex(__LINE__ + 1))
1094
+ expect_any_instance_of(klass).to receive(:foo) { |args| }
1095
+ klass.new(:faces).foo
1096
+ end
1097
+
1098
+ it "won't warn if there is no implementation block on an stub" do
1099
+ expect(RSpec).not_to receive(:warn_deprecation)
1100
+
1101
+ klass = Struct.new(:bees)
1102
+
1103
+ allow_any_instance_of(klass).to receive(:foo)
1104
+ klass.new(:faces).foo
1105
+ end
1106
+ end
1107
+ end
1108
+
959
1109
  context 'when used in conjunction with a `dup`' do
960
1110
  it "doesn't cause an infinite loop" do
961
1111
  pending "This intermittently fails on JRuby" if RUBY_PLATFORM == 'java'
@@ -1026,7 +1176,6 @@ module RSpec
1026
1176
  expect(instance.existing_method).to eq :stubbed_return_value
1027
1177
 
1028
1178
  RSpec::Mocks.verify
1029
- RSpec::Mocks.teardown
1030
1179
 
1031
1180
  expect(instance.existing_method).to eq :existing_method_return_value
1032
1181
  end