Skip to content

Commit 6e1d698

Browse files
authored
Merge pull request #951 from andrykonchin/optimize-performance-let-setup
Performance. RSpec/LetSetup
2 parents 5551988 + 28eab5a commit 6e1d698

File tree

2 files changed

+64
-3
lines changed

2 files changed

+64
-3
lines changed

lib/rubocop/cop/rspec/let_setup.rb

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff 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

spec/rubocop/cop/rspec/let_setup_spec.rb

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,4 +63,53 @@
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
66115
end

0 commit comments

Comments
 (0)