File tree Expand file tree Collapse file tree 2 files changed +64
-3
lines changed Expand file tree Collapse file tree 2 files changed +64
-3
lines changed Original file line number Diff line number Diff line change @@ -28,14 +28,20 @@ module RSpec
2828 class LetSetup < Cop
2929 MSG = 'Do not use `let!` to setup objects not referenced in tests.'
3030
31- def_node_search :let_bang , <<-PATTERN
31+ def_node_matcher :example_or_shared_group_or_including? ,
32+ (
33+ ExampleGroups ::ALL + SharedGroups ::ALL +
34+ Includes ::ALL
35+ ) . block_pattern
36+
37+ def_node_matcher :let_bang , <<-PATTERN
3238 (block $(send nil? :let! (sym $_)) args ...)
3339 PATTERN
3440
3541 def_node_search :method_called? , '(send nil? %)'
3642
3743 def on_block ( node )
38- return unless example_group ?( node )
44+ return unless example_or_shared_group_or_including ?( node )
3945
4046 unused_let_bang ( node ) do |let |
4147 add_offense ( let )
@@ -45,10 +51,16 @@ def on_block(node)
4551 private
4652
4753 def unused_let_bang ( node )
48- let_bang ( node ) do |method_send , method_name |
54+ child_let_bang ( node ) do |method_send , method_name |
4955 yield ( method_send ) unless method_called? ( node , method_name )
5056 end
5157 end
58+
59+ def child_let_bang ( node , &block )
60+ RuboCop ::RSpec ::ExampleGroup . new ( node ) . lets . each do |let |
61+ let_bang ( let , &block )
62+ end
63+ end
5264 end
5365 end
5466 end
Original file line number Diff line number Diff line change 6363 end
6464 RUBY
6565 end
66+
67+ it 'complains when let! is used and not referenced in shared example group' do
68+ expect_offense ( <<-RUBY )
69+ shared_context 'foo' do
70+ let!(:bar) { baz }
71+ ^^^^^^^^^^ Do not use `let!` to setup objects not referenced in tests.
72+
73+ it 'does not use bar' do
74+ expect(baz).to eq(qux)
75+ end
76+ end
77+ RUBY
78+ end
79+
80+ it 'complains when let! used in shared example including' do
81+ expect_offense ( <<-RUBY )
82+ describe Foo do
83+ it_behaves_like 'bar' do
84+ let!(:baz) { foobar }
85+ ^^^^^^^^^^ Do not use `let!` to setup objects not referenced in tests.
86+ let(:a) { b }
87+ end
88+ end
89+ RUBY
90+ end
91+
92+ it 'complains when there is only one nested node into example group' do
93+ expect_offense ( <<-RUBY )
94+ describe Foo do
95+ let!(:bar) { baz }
96+ ^^^^^^^^^^ Do not use `let!` to setup objects not referenced in tests.
97+ end
98+ RUBY
99+ end
100+
101+ it 'complains when there is a custom nesting level' do
102+ expect_offense ( <<-RUBY )
103+ describe Foo do
104+ [].each do |i|
105+ let!(:bar) { i }
106+ ^^^^^^^^^^ Do not use `let!` to setup objects not referenced in tests.
107+
108+ it 'does not use bar' do
109+ expect(baz).to eq(qux)
110+ end
111+ end
112+ end
113+ RUBY
114+ end
66115end
You can’t perform that action at this time.
0 commit comments