transpec 1.8.0 → 1.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -1
- data/.travis.yml +1 -1
- data/CHANGELOG.md +6 -0
- data/README.md +106 -79
- data/README.md.erb +91 -73
- data/lib/transpec/cli.rb +1 -1
- data/lib/transpec/converter.rb +16 -5
- data/lib/transpec/syntax/allow.rb +4 -0
- data/lib/transpec/syntax/expect.rb +4 -0
- data/lib/transpec/syntax/have.rb +24 -13
- data/lib/transpec/syntax/method_stub.rb +42 -6
- data/lib/transpec/syntax/mixin/any_instance_block.rb +14 -5
- data/lib/transpec/syntax/mixin/expect_base.rb +6 -5
- data/lib/transpec/syntax/mixin/messaging_host.rb +17 -0
- data/lib/transpec/syntax/mixin/{allow_no_message.rb → no_message_allowance.rb} +5 -4
- data/lib/transpec/syntax/mixin/send.rb +0 -13
- data/lib/transpec/syntax/mixin/should_base.rb +7 -1
- data/lib/transpec/syntax/mixin/useless_and_return.rb +79 -0
- data/lib/transpec/syntax/operator_matcher.rb +20 -4
- data/lib/transpec/syntax/receive.rb +21 -6
- data/lib/transpec/syntax/should_receive.rb +14 -11
- data/lib/transpec/util.rb +46 -0
- data/lib/transpec/version.rb +1 -1
- data/spec/transpec/converter_spec.rb +60 -18
- data/spec/transpec/syntax/expect_spec.rb +41 -9
- data/spec/transpec/syntax/method_stub_spec.rb +99 -2
- data/spec/transpec/syntax/operator_matcher_spec.rb +19 -84
- data/spec/transpec/syntax/receive_spec.rb +231 -2
- data/spec/transpec/syntax/should_receive_spec.rb +38 -0
- data/spec/transpec/syntax/should_spec.rb +28 -39
- data/tasks/readme.rake +16 -2
- metadata +5 -3
@@ -8,16 +8,22 @@ require 'ast'
|
|
8
8
|
module Transpec
|
9
9
|
class Syntax
|
10
10
|
class OperatorMatcher < Syntax
|
11
|
-
|
11
|
+
extend ::AST::Sexp
|
12
|
+
include Mixin::Send, Util
|
12
13
|
|
13
14
|
OPERATORS = [:==, :===, :<, :<=, :>, :>=, :=~].freeze
|
15
|
+
BE_NODE = s(:send, nil, :be)
|
14
16
|
|
15
17
|
def self.standalone?
|
16
18
|
false
|
17
19
|
end
|
18
20
|
|
19
|
-
def self.
|
20
|
-
|
21
|
+
def self.target_node?(node, runtime_data = nil)
|
22
|
+
node = node.parent_node if node == BE_NODE
|
23
|
+
receiver_node, method_name, *_ = *node
|
24
|
+
return false if receiver_node.nil?
|
25
|
+
return false unless OPERATORS.include?(method_name)
|
26
|
+
check_target_node_dynamically(node, runtime_data)
|
21
27
|
end
|
22
28
|
|
23
29
|
add_dynamic_analysis_request do |rewriter|
|
@@ -26,6 +32,16 @@ module Transpec
|
|
26
32
|
end
|
27
33
|
end
|
28
34
|
|
35
|
+
def initialize(node, source_rewriter = nil, runtime_data = nil, report = nil)
|
36
|
+
operator_node = if node == BE_NODE
|
37
|
+
node.parent_node
|
38
|
+
else
|
39
|
+
node
|
40
|
+
end
|
41
|
+
|
42
|
+
super(operator_node, source_rewriter, runtime_data, report)
|
43
|
+
end
|
44
|
+
|
29
45
|
def convert_operator!(parenthesize_arg = true)
|
30
46
|
case method_name
|
31
47
|
when :==
|
@@ -126,7 +142,7 @@ module Transpec
|
|
126
142
|
end
|
127
143
|
|
128
144
|
def be_node
|
129
|
-
if receiver_node ==
|
145
|
+
if receiver_node == BE_NODE
|
130
146
|
receiver_node
|
131
147
|
else
|
132
148
|
nil
|
@@ -3,12 +3,12 @@
|
|
3
3
|
require 'transpec/syntax'
|
4
4
|
require 'transpec/syntax/mixin/send'
|
5
5
|
require 'transpec/syntax/mixin/owned_matcher'
|
6
|
-
require 'transpec/syntax/mixin/
|
6
|
+
require 'transpec/syntax/mixin/messaging_host'
|
7
7
|
|
8
8
|
module Transpec
|
9
9
|
class Syntax
|
10
10
|
class Receive < Syntax
|
11
|
-
include Mixin::Send, Mixin::OwnedMatcher, Mixin::
|
11
|
+
include Mixin::Send, Mixin::OwnedMatcher, Mixin::MessagingHost
|
12
12
|
|
13
13
|
attr_reader :expectation
|
14
14
|
|
@@ -16,13 +16,16 @@ module Transpec
|
|
16
16
|
receiver_node.nil? && method_name == :receive
|
17
17
|
end
|
18
18
|
|
19
|
+
def remove_useless_and_return!
|
20
|
+
removed = super
|
21
|
+
return unless removed
|
22
|
+
@report.records << ReceiveUselessAndReturnRecord.new(self)
|
23
|
+
end
|
24
|
+
|
19
25
|
def add_receiver_arg_to_any_instance_implementation_block!
|
20
26
|
added = super
|
21
27
|
return unless added
|
22
|
-
@report.records <<
|
23
|
-
"#{@expectation.method_name}(Klass).to receive(:message) { |arg| }",
|
24
|
-
"#{@expectation.method_name}(Klass).to receive(:message) { |instance, arg| }"
|
25
|
-
)
|
28
|
+
@report.records << ReceiveAnyInstanceBlockRecord.new(self)
|
26
29
|
end
|
27
30
|
|
28
31
|
def any_instance?
|
@@ -33,6 +36,18 @@ module Transpec
|
|
33
36
|
return unless any_instance?
|
34
37
|
super || @expectation.block_node
|
35
38
|
end
|
39
|
+
|
40
|
+
class ReceiveAnyInstanceBlockRecord < AnyInstanceBlockRecord
|
41
|
+
def base_syntax
|
42
|
+
"#{@host.expectation.method_name}(Klass).to receive(:message)"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class ReceiveUselessAndReturnRecord < UselessAndReturnRecord
|
47
|
+
def base_syntax
|
48
|
+
"#{@host.expectation.method_name_for_instance}(obj).to receive(:message)"
|
49
|
+
end
|
50
|
+
end
|
36
51
|
end
|
37
52
|
end
|
38
53
|
end
|
@@ -3,14 +3,13 @@
|
|
3
3
|
require 'transpec/syntax'
|
4
4
|
require 'transpec/syntax/mixin/expectizable'
|
5
5
|
require 'transpec/syntax/mixin/monkey_patch_any_instance'
|
6
|
-
require 'transpec/syntax/mixin/
|
7
|
-
require 'transpec/
|
6
|
+
require 'transpec/syntax/mixin/messaging_host'
|
7
|
+
require 'transpec/util'
|
8
8
|
|
9
9
|
module Transpec
|
10
10
|
class Syntax
|
11
11
|
class ShouldReceive < Syntax
|
12
|
-
include Mixin::Expectizable, Mixin::MonkeyPatchAnyInstance, Mixin::
|
13
|
-
Mixin::AllowNoMessage
|
12
|
+
include Mixin::Expectizable, Mixin::MonkeyPatchAnyInstance, Mixin::MessagingHost, Util
|
14
13
|
|
15
14
|
alias_method :useless_expectation?, :allow_no_message?
|
16
15
|
|
@@ -61,7 +60,7 @@ module Transpec
|
|
61
60
|
end
|
62
61
|
|
63
62
|
convert_to_syntax!('allow', negative_form)
|
64
|
-
|
63
|
+
remove_no_message_allowance!
|
65
64
|
|
66
65
|
register_record(AllowRecord, negative_form)
|
67
66
|
end
|
@@ -70,13 +69,17 @@ module Transpec
|
|
70
69
|
return unless useless_expectation?
|
71
70
|
|
72
71
|
replace(selector_range, 'stub')
|
73
|
-
|
72
|
+
remove_no_message_allowance!
|
74
73
|
|
75
74
|
register_record(StubRecord)
|
76
75
|
end
|
77
76
|
|
77
|
+
def remove_useless_and_return!
|
78
|
+
super && register_record(MonkeyPatchUselessAndReturnRecord)
|
79
|
+
end
|
80
|
+
|
78
81
|
def add_receiver_arg_to_any_instance_implementation_block!
|
79
|
-
super && register_record(
|
82
|
+
super && register_record(MonkeyPatchAnyInstanceBlockRecord)
|
80
83
|
end
|
81
84
|
|
82
85
|
private
|
@@ -112,7 +115,7 @@ module Transpec
|
|
112
115
|
def broken_block_nodes
|
113
116
|
@broken_block_nodes ||= [
|
114
117
|
block_node_taken_by_with_method_with_no_normal_args,
|
115
|
-
|
118
|
+
block_node_followed_by_fluent_method
|
116
119
|
].compact.uniq
|
117
120
|
end
|
118
121
|
|
@@ -128,7 +131,7 @@ module Transpec
|
|
128
131
|
# (args
|
129
132
|
# (arg :block_arg)) nil)
|
130
133
|
def block_node_taken_by_with_method_with_no_normal_args
|
131
|
-
|
134
|
+
each_backward_chained_node(node, :child_as_second_arg) do |chained_node, child_node|
|
132
135
|
next unless chained_node.block_type?
|
133
136
|
return nil unless child_node.children[1] == :with
|
134
137
|
return nil if child_node.children[2]
|
@@ -146,8 +149,8 @@ module Transpec
|
|
146
149
|
# (sym :method_name))
|
147
150
|
# (args
|
148
151
|
# (arg :block_arg)) nil) :once)
|
149
|
-
def
|
150
|
-
|
152
|
+
def block_node_followed_by_fluent_method
|
153
|
+
each_backward_chained_node(node, :child_as_second_arg) do |chained_node, child_node|
|
151
154
|
next unless chained_node.send_type?
|
152
155
|
return child_node if child_node.block_type?
|
153
156
|
end
|
data/lib/transpec/util.rb
CHANGED
@@ -74,6 +74,52 @@ module Transpec
|
|
74
74
|
parent_node
|
75
75
|
end
|
76
76
|
|
77
|
+
def each_forward_chained_node(origin_node, mode = nil)
|
78
|
+
return to_enum(__method__, origin_node, mode) unless block_given?
|
79
|
+
|
80
|
+
yield origin_node if mode == :include_origin
|
81
|
+
|
82
|
+
parent_node = origin_node
|
83
|
+
|
84
|
+
loop do
|
85
|
+
child_node = parent_node.children.first
|
86
|
+
|
87
|
+
return unless child_node
|
88
|
+
return unless [:send, :block].include?(child_node.type)
|
89
|
+
|
90
|
+
if mode == :parent_as_second_arg
|
91
|
+
yield child_node, parent_node
|
92
|
+
else
|
93
|
+
yield child_node
|
94
|
+
end
|
95
|
+
|
96
|
+
parent_node = child_node
|
97
|
+
end
|
98
|
+
|
99
|
+
nil
|
100
|
+
end
|
101
|
+
|
102
|
+
def each_backward_chained_node(origin_node, mode = nil)
|
103
|
+
return to_enum(__method__, origin_node, mode) unless block_given?
|
104
|
+
|
105
|
+
yield origin_node if mode == :include_origin
|
106
|
+
|
107
|
+
origin_node.each_ancestor_node.reduce(origin_node) do |child_node, parent_node|
|
108
|
+
return unless [:send, :block].include?(parent_node.type)
|
109
|
+
return unless parent_node.children.first.equal?(child_node)
|
110
|
+
|
111
|
+
if mode == :child_as_second_arg
|
112
|
+
yield parent_node, child_node
|
113
|
+
else
|
114
|
+
yield parent_node
|
115
|
+
end
|
116
|
+
|
117
|
+
parent_node
|
118
|
+
end
|
119
|
+
|
120
|
+
nil
|
121
|
+
end
|
122
|
+
|
77
123
|
def indentation_of_line(arg)
|
78
124
|
line = case arg
|
79
125
|
when AST::Node then arg.loc.expression.source_line
|
data/lib/transpec/version.rb
CHANGED
@@ -367,7 +367,7 @@ module Transpec
|
|
367
367
|
|
368
368
|
describe '#process_expect' do
|
369
369
|
let(:expect_object) { double('expect_object', receive_matcher: receive_object).as_null_object }
|
370
|
-
let(:receive_object) { double('receive_object') }
|
370
|
+
let(:receive_object) { double('receive_object').as_null_object }
|
371
371
|
|
372
372
|
context 'when Configuration#convert_have_items? is true' do
|
373
373
|
before { configuration.convert_have_items = true }
|
@@ -400,6 +400,11 @@ module Transpec
|
|
400
400
|
end
|
401
401
|
end
|
402
402
|
|
403
|
+
it "invokes #process_useless_and_return with the expect's #receive matcher" do
|
404
|
+
converter.should_receive(:process_useless_and_return).with(receive_object)
|
405
|
+
converter.process_expect(expect_object)
|
406
|
+
end
|
407
|
+
|
403
408
|
it "invokes #process_any_instance_block with the expect's #receive matcher" do
|
404
409
|
converter.should_receive(:process_any_instance_block).with(receive_object)
|
405
410
|
converter.process_expect(expect_object)
|
@@ -408,7 +413,12 @@ module Transpec
|
|
408
413
|
|
409
414
|
describe '#process_allow' do
|
410
415
|
let(:allow_object) { double('allow_object', receive_matcher: receive_object).as_null_object }
|
411
|
-
let(:receive_object) { double('receive_object') }
|
416
|
+
let(:receive_object) { double('receive_object').as_null_object }
|
417
|
+
|
418
|
+
it "invokes #process_useless_and_return with the allow's #receive matcher" do
|
419
|
+
converter.should_receive(:process_useless_and_return).with(receive_object)
|
420
|
+
converter.process_allow(allow_object)
|
421
|
+
end
|
412
422
|
|
413
423
|
it "invokes #process_any_instance_block with the allow's #receive matcher" do
|
414
424
|
converter.should_receive(:process_any_instance_block).with(receive_object)
|
@@ -573,9 +583,14 @@ module Transpec
|
|
573
583
|
end
|
574
584
|
end
|
575
585
|
|
586
|
+
it 'invokes #process_useless_and_return with the should_receive' do
|
587
|
+
converter.should_receive(:process_useless_and_return).with(should_receive_object)
|
588
|
+
converter.process_should_receive(should_receive_object)
|
589
|
+
end
|
590
|
+
|
576
591
|
it 'invokes #process_any_instance_block with the should_receive' do
|
577
592
|
converter.should_receive(:process_any_instance_block).with(should_receive_object)
|
578
|
-
converter.
|
593
|
+
converter.process_should_receive(should_receive_object)
|
579
594
|
end
|
580
595
|
end
|
581
596
|
|
@@ -610,16 +625,16 @@ module Transpec
|
|
610
625
|
end
|
611
626
|
end
|
612
627
|
|
613
|
-
shared_examples 'invokes MethodStub#
|
614
|
-
it 'invokes MethodStub#
|
615
|
-
method_stub_object.should_receive(:
|
628
|
+
shared_examples 'invokes MethodStub#remove_no_message_allowance!' do
|
629
|
+
it 'invokes MethodStub#remove_no_message_allowance!' do
|
630
|
+
method_stub_object.should_receive(:remove_no_message_allowance!)
|
616
631
|
converter.process_method_stub(method_stub_object)
|
617
632
|
end
|
618
633
|
end
|
619
634
|
|
620
|
-
shared_examples 'does not invoke MethodStub#
|
621
|
-
it 'does not invoke MethodStub#
|
622
|
-
method_stub_object.should_not_receive(:
|
635
|
+
shared_examples 'does not invoke MethodStub#remove_no_message_allowance!' do
|
636
|
+
it 'does not invoke MethodStub#remove_no_message_allowance!' do
|
637
|
+
method_stub_object.should_not_receive(:remove_no_message_allowance!)
|
623
638
|
converter.process_method_stub(method_stub_object)
|
624
639
|
end
|
625
640
|
end
|
@@ -634,7 +649,7 @@ module Transpec
|
|
634
649
|
before { method_stub_object.stub(:hash_arg?).and_return(false) }
|
635
650
|
include_examples 'invokes MethodStub#allowize!'
|
636
651
|
include_examples 'does not invoke MethodStub#convert_deprecated_method!'
|
637
|
-
include_examples 'invokes MethodStub#
|
652
|
+
include_examples 'invokes MethodStub#remove_no_message_allowance!'
|
638
653
|
end
|
639
654
|
|
640
655
|
context 'and MethodStub#hash_arg? is true' do
|
@@ -647,14 +662,14 @@ module Transpec
|
|
647
662
|
before { rspec_version.stub(:receive_messages_available?).and_return(true) }
|
648
663
|
include_examples 'invokes MethodStub#allowize!'
|
649
664
|
include_examples 'does not invoke MethodStub#convert_deprecated_method!'
|
650
|
-
include_examples 'invokes MethodStub#
|
665
|
+
include_examples 'invokes MethodStub#remove_no_message_allowance!'
|
651
666
|
end
|
652
667
|
|
653
668
|
context 'and RSpecVersion#receive_messages_available? is false' do
|
654
669
|
before { rspec_version.stub(:receive_messages_available?).and_return(false) }
|
655
670
|
include_examples 'invokes MethodStub#allowize!'
|
656
671
|
include_examples 'does not invoke MethodStub#convert_deprecated_method!'
|
657
|
-
include_examples 'invokes MethodStub#
|
672
|
+
include_examples 'invokes MethodStub#remove_no_message_allowance!'
|
658
673
|
end
|
659
674
|
end
|
660
675
|
|
@@ -665,14 +680,14 @@ module Transpec
|
|
665
680
|
before { rspec_version.stub(:receive_messages_available?).and_return(true) }
|
666
681
|
include_examples 'invokes MethodStub#allowize!'
|
667
682
|
include_examples 'does not invoke MethodStub#convert_deprecated_method!'
|
668
|
-
include_examples 'invokes MethodStub#
|
683
|
+
include_examples 'invokes MethodStub#remove_no_message_allowance!'
|
669
684
|
end
|
670
685
|
|
671
686
|
context 'and RSpecVersion#receive_messages_available? is false' do
|
672
687
|
before { rspec_version.stub(:receive_messages_available?).and_return(false) }
|
673
688
|
include_examples 'does not invoke MethodStub#allowize!'
|
674
689
|
include_examples 'invokes MethodStub#convert_deprecated_method!'
|
675
|
-
include_examples 'invokes MethodStub#
|
690
|
+
include_examples 'invokes MethodStub#remove_no_message_allowance!'
|
676
691
|
end
|
677
692
|
end
|
678
693
|
end
|
@@ -686,7 +701,7 @@ module Transpec
|
|
686
701
|
|
687
702
|
include_examples 'invokes MethodStub#allowize!'
|
688
703
|
include_examples 'does not invoke MethodStub#convert_deprecated_method!'
|
689
|
-
include_examples 'does not invoke MethodStub#
|
704
|
+
include_examples 'does not invoke MethodStub#remove_no_message_allowance!'
|
690
705
|
end
|
691
706
|
end
|
692
707
|
|
@@ -698,7 +713,7 @@ module Transpec
|
|
698
713
|
|
699
714
|
include_examples 'does not invoke MethodStub#allowize!'
|
700
715
|
include_examples 'invokes MethodStub#convert_deprecated_method!'
|
701
|
-
include_examples 'invokes MethodStub#
|
716
|
+
include_examples 'invokes MethodStub#remove_no_message_allowance!'
|
702
717
|
end
|
703
718
|
|
704
719
|
context 'and Configuration#convert_deprecated_method? is false' do
|
@@ -706,13 +721,18 @@ module Transpec
|
|
706
721
|
|
707
722
|
include_examples 'does not invoke MethodStub#allowize!'
|
708
723
|
include_examples 'does not invoke MethodStub#convert_deprecated_method!'
|
709
|
-
include_examples 'does not invoke MethodStub#
|
724
|
+
include_examples 'does not invoke MethodStub#remove_no_message_allowance!'
|
710
725
|
end
|
711
726
|
end
|
712
727
|
|
728
|
+
it 'invokes #process_useless_and_return with the method stub' do
|
729
|
+
converter.should_receive(:process_useless_and_return).with(method_stub_object)
|
730
|
+
converter.process_method_stub(method_stub_object)
|
731
|
+
end
|
732
|
+
|
713
733
|
it 'invokes #process_any_instance_block with the method stub' do
|
714
734
|
converter.should_receive(:process_any_instance_block).with(method_stub_object)
|
715
|
-
converter.
|
735
|
+
converter.process_method_stub(method_stub_object)
|
716
736
|
end
|
717
737
|
end
|
718
738
|
|
@@ -1047,6 +1067,28 @@ module Transpec
|
|
1047
1067
|
end
|
1048
1068
|
end
|
1049
1069
|
|
1070
|
+
describe '#process_useless_and_return' do
|
1071
|
+
let(:messaging_host) { double('messaging host').as_null_object }
|
1072
|
+
|
1073
|
+
context 'when Configuration#convert_deprecated_method? returns true' do
|
1074
|
+
before { configuration.convert_deprecated_method = true }
|
1075
|
+
|
1076
|
+
it 'invokes #remove_useless_and_return!' do
|
1077
|
+
messaging_host.should_receive(:remove_useless_and_return!)
|
1078
|
+
converter.process_useless_and_return(messaging_host)
|
1079
|
+
end
|
1080
|
+
end
|
1081
|
+
|
1082
|
+
context 'when Configuration#convert_deprecated_method? returns false' do
|
1083
|
+
before { configuration.convert_deprecated_method = false }
|
1084
|
+
|
1085
|
+
it 'does nothing' do
|
1086
|
+
messaging_host.should_not_receive(:remove_useless_and_return!)
|
1087
|
+
converter.process_useless_and_return(messaging_host)
|
1088
|
+
end
|
1089
|
+
end
|
1090
|
+
end
|
1091
|
+
|
1050
1092
|
describe '#process_any_instance_block' do
|
1051
1093
|
let(:messaging_host) { double('messaging host').as_null_object }
|
1052
1094
|
|
@@ -27,37 +27,69 @@ module Transpec
|
|
27
27
|
end
|
28
28
|
|
29
29
|
describe '#matcher_node' do
|
30
|
-
|
30
|
+
let(:matcher_name) { expect_object.matcher_node.children[1] }
|
31
|
+
|
32
|
+
context 'when the matcher is not taking a block' do
|
31
33
|
let(:source) do
|
32
34
|
<<-END
|
33
35
|
describe 'example' do
|
34
36
|
it 'is empty' do
|
35
|
-
expect(subject).to
|
37
|
+
expect(subject).to be_empty
|
36
38
|
end
|
37
39
|
end
|
38
40
|
END
|
39
41
|
end
|
40
42
|
|
41
43
|
it 'returns send node of the matcher' do
|
42
|
-
|
43
|
-
method_name.should == :receive
|
44
|
+
matcher_name.should == :be_empty
|
44
45
|
end
|
45
46
|
end
|
46
47
|
|
47
|
-
context 'when the matcher is
|
48
|
+
context 'when the matcher is taking a block' do
|
48
49
|
let(:source) do
|
49
50
|
<<-END
|
50
51
|
describe 'example' do
|
51
|
-
it '
|
52
|
-
expect(subject).to
|
52
|
+
it 'receives :foo' do
|
53
|
+
expect(subject).to receive(:foo) { }
|
53
54
|
end
|
54
55
|
end
|
55
56
|
END
|
56
57
|
end
|
57
58
|
|
58
59
|
it 'returns send node of the matcher' do
|
59
|
-
|
60
|
-
|
60
|
+
matcher_name.should == :receive
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
context 'when the matcher is chained by another method' do
|
65
|
+
let(:source) do
|
66
|
+
<<-END
|
67
|
+
describe 'example' do
|
68
|
+
it 'receives :foo twice' do
|
69
|
+
expect(subject).to receive(:foo).twice
|
70
|
+
end
|
71
|
+
end
|
72
|
+
END
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'returns the first node of the chain' do
|
76
|
+
matcher_name.should == :receive
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context 'when the matcher is chained by another method that is taking a block' do
|
81
|
+
let(:source) do
|
82
|
+
<<-END
|
83
|
+
describe 'example' do
|
84
|
+
it 'receives :foo twice' do
|
85
|
+
expect(subject).to receive(:foo).twice { }
|
86
|
+
end
|
87
|
+
end
|
88
|
+
END
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'returns the first node of the chain' do
|
92
|
+
matcher_name.should == :receive
|
61
93
|
end
|
62
94
|
end
|
63
95
|
end
|