rubocop-rspec 1.31.0 → 1.32.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7dc31ff59557e82627745015742087123734c2d1abda96cc277ac243c8bee1f2
4
- data.tar.gz: 819b5fea22acb7db40512b8291ce8cddec7c9580fb62ccb38bad146bdeaa27e1
3
+ metadata.gz: c0fcdb4a1fb882713a667ae92edf352ee496300bd20cbd44c79ec0c79773691f
4
+ data.tar.gz: 22ed75baf52c414c530edef39ba1a2b361c4e2060711775c093585c7a10ffe53
5
5
  SHA512:
6
- metadata.gz: 1998ae7af3934178c41e2c8c965d33af83d1eb30e1becf04ef69b9b6eda8b023d7f2f8e63e2d4a5b2edc74d254d3beb93b34d48d1edbfa318c32d8f389cded80
7
- data.tar.gz: 59cdfdb2dd906222e08e4839f3c9b8ee8d0dcb81d28ad65de6e7fd6055849d7eac4393d21197b8de621934e71ae4405345f6be71f6fe9eb0d1b09562060a388a
6
+ metadata.gz: 597bacb5b6c60657a33532a1d625008030338e16f8fca2e42d1a9b0dc4bf76a6e9296d8fb2948ad0947bb522212bc53ef997fc4155168c89e76c66fda4e6ef87
7
+ data.tar.gz: 9ecac64a0f6cccba7a794125e0e4bd0bd47722f8e5d2a3efed8828709fdc8c682ca09794a74c33d92f6feec90d70b856d2bf1f544d13c51fc4f63d7c398568e1
@@ -2,6 +2,14 @@
2
2
 
3
3
  ## Master (Unreleased)
4
4
 
5
+ ## 1.32.0 (2019-01-27)
6
+
7
+ * Add `RSpec/Yield` cop, suggesting using the `and_yield` method when stubbing a method, accepting a block. ([@Darhazer][])
8
+ * Fix `FactoryBot/CreateList` autocorrect crashing when the factory is called with a block=. ([@Darhazer][])
9
+ * Fixed `RSpec/Focus` not flagging some cases of `RSpec.describe` with `focus: true`. ([@Darhazer][])
10
+ * Fixed `RSpec/Pending` not flagging some cases of `RSpec.describe` with `:skip`. ([@Darhazer][])
11
+ * Fix false positive in `RSpec/ReceiveCounts` when method name `exactly`, `at_least` or `at_most` is used along with `times`, without being an RSpec API. ([@Darhazer][])
12
+
5
13
  ## 1.31.0 (2019-01-02)
6
14
 
7
15
  * Add `IgnoreSharedExamples` option for `RSpec/NamedSubject`. ([@RST-J][])
@@ -417,6 +417,11 @@ RSpec/VoidExpect:
417
417
  Enabled: true
418
418
  StyleGuide: http://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/VoidExpect
419
419
 
420
+ RSpec/Yield:
421
+ Description: This cop checks for calling a block within a stub.
422
+ Enabled: true
423
+ StyleGuide: http://www.rubydoc.info/gems/rubocop-rspec/RuboCop/Cop/RSpec/Yield
424
+
420
425
  Capybara/CurrentPathExpectation:
421
426
  Description: Checks that no expectations are set on Capybara's `current_path`.
422
427
  Enabled: true
@@ -69,9 +69,9 @@ module RuboCop
69
69
 
70
70
  def autocorrect(node)
71
71
  if style == :create_list
72
- autocorrect_n_times_to_create_list(node)
72
+ CreateListCorrector.new(node)
73
73
  else
74
- autocorrect_create_list_to_n_times(node)
74
+ TimesCorrector.new(node)
75
75
  end
76
76
  end
77
77
 
@@ -85,63 +85,127 @@ module RuboCop
85
85
  end
86
86
  end
87
87
 
88
- def autocorrect_n_times_to_create_list(node)
89
- block = node.parent
90
- count = block.receiver.source
91
- replacement = factory_call_replacement(block.body, count)
88
+ # :nodoc
89
+ class Corrector
90
+ private
92
91
 
93
- lambda do |corrector|
94
- corrector.replace(block.loc.expression, replacement)
92
+ def build_options_string(options)
93
+ options.map(&:source).join(', ')
94
+ end
95
+
96
+ def format_method_call(node, method, arguments)
97
+ if node.block_type? || node.parenthesized?
98
+ "#{method}(#{arguments})"
99
+ else
100
+ "#{method} #{arguments}"
101
+ end
102
+ end
103
+
104
+ def format_receiver(receiver)
105
+ return '' unless receiver
106
+
107
+ "#{receiver.source}."
95
108
  end
96
109
  end
97
110
 
98
- def autocorrect_create_list_to_n_times(node)
99
- replacement = generate_n_times_block(node)
100
- lambda do |corrector|
111
+ # :nodoc
112
+ class TimesCorrector < Corrector
113
+ def initialize(node)
114
+ @node = node
115
+ end
116
+
117
+ def call(corrector)
118
+ replacement = generate_n_times_block(node)
101
119
  corrector.replace(node.loc.expression, replacement)
102
120
  end
103
- end
104
121
 
105
- def generate_n_times_block(node)
106
- receiver, factory, count, options = *factory_list_call(node)
122
+ private
107
123
 
108
- arguments = ":#{factory}"
109
- options = build_options_string(options)
110
- arguments += ", #{options}" unless options.empty?
124
+ attr_reader :node
111
125
 
112
- replacement = format_receiver(receiver)
113
- replacement += format_method_call(node, 'create', arguments)
114
- "#{count}.times { #{replacement} }"
126
+ def generate_n_times_block(node)
127
+ factory, count, *options = node.arguments
128
+
129
+ arguments = factory.source
130
+ options = build_options_string(options)
131
+ arguments += ", #{options}" unless options.empty?
132
+
133
+ replacement = format_receiver(node.receiver)
134
+ replacement += format_method_call(node, 'create', arguments)
135
+ "#{count.source}.times { #{replacement} }"
136
+ end
115
137
  end
116
138
 
117
- def factory_call_replacement(body, count)
118
- receiver, factory, options = *factory_call(body)
139
+ # :nodoc:
140
+ class CreateListCorrector < Corrector
141
+ def initialize(node)
142
+ @node = node.parent
143
+ end
119
144
 
120
- arguments = ":#{factory}, #{count}"
121
- options = build_options_string(options)
122
- arguments += ", #{options}" unless options.empty?
145
+ def call(corrector)
146
+ replacement = if node.body.block_type?
147
+ call_with_block_replacement(node)
148
+ else
149
+ call_replacement(node)
150
+ end
123
151
 
124
- replacement = format_receiver(receiver)
125
- replacement += format_method_call(body, 'create_list', arguments)
126
- replacement
127
- end
152
+ corrector.replace(node.loc.expression, replacement)
153
+ end
128
154
 
129
- def build_options_string(options)
130
- options.map(&:source).join(', ')
131
- end
155
+ private
132
156
 
133
- def format_method_call(node, method, arguments)
134
- if node.parenthesized?
135
- "#{method}(#{arguments})"
136
- else
137
- "#{method} #{arguments}"
157
+ attr_reader :node
158
+
159
+ def call_with_block_replacement(node)
160
+ block = node.body
161
+ arguments = build_arguments(block, node.receiver.source)
162
+ replacement = format_receiver(block.send_node.receiver)
163
+ replacement += format_method_call(block, 'create_list', arguments)
164
+ replacement += format_block(block)
165
+ replacement
138
166
  end
139
- end
140
167
 
141
- def format_receiver(receiver)
142
- return '' unless receiver
168
+ def build_arguments(node, count)
169
+ factory, *options = *node.send_node.arguments
170
+
171
+ arguments = ":#{factory.value}, #{count}"
172
+ options = build_options_string(options)
173
+ arguments += ", #{options}" unless options.empty?
174
+ arguments
175
+ end
176
+
177
+ def call_replacement(node)
178
+ block = node.body
179
+ factory, *options = *block.arguments
180
+
181
+ arguments = "#{factory.source}, #{node.receiver.source}"
182
+ options = build_options_string(options)
183
+ arguments += ", #{options}" unless options.empty?
143
184
 
144
- "#{receiver.source}."
185
+ replacement = format_receiver(block.receiver)
186
+ replacement += format_method_call(block, 'create_list', arguments)
187
+ replacement
188
+ end
189
+
190
+ def format_block(node)
191
+ if node.body.begin_type?
192
+ format_multiline_block(node)
193
+ else
194
+ format_singeline_block(node)
195
+ end
196
+ end
197
+
198
+ def format_multiline_block(node)
199
+ indent = ' ' * node.body.loc.column
200
+ indent_end = ' ' * node.parent.loc.column
201
+ " do #{node.arguments.source}\n" \
202
+ "#{indent}#{node.body.source}\n" \
203
+ "#{indent_end}end"
204
+ end
205
+
206
+ def format_singeline_block(node)
207
+ " { #{node.arguments.source} #{node.body.source} }"
208
+ end
145
209
  end
146
210
  end
147
211
  end
@@ -36,8 +36,8 @@ module RuboCop
36
36
  FOCUS_TRUE = s(:pair, FOCUS_SYMBOL, s(:true))
37
37
 
38
38
  def_node_matcher :metadata, <<-PATTERN
39
- {(send nil? #{FOCUSABLE_SELECTORS} ... (hash $...))
40
- (send nil? #{FOCUSABLE_SELECTORS} $...)}
39
+ {(send {(const nil? :RSpec) nil?} #{FOCUSABLE_SELECTORS} ... (hash $...))
40
+ (send {(const nil? :RSpec) nil?} #{FOCUSABLE_SELECTORS} $...)}
41
41
  PATTERN
42
42
 
43
43
  def_node_matcher :focused_block?, focused.send_pattern
@@ -37,8 +37,8 @@ module RuboCop
37
37
  PENDING_SYMBOL = s(:sym, :pending)
38
38
 
39
39
  def_node_matcher :metadata, <<-PATTERN
40
- {(send nil? #{SKIPPABLE_SELECTORS} ... (hash $...))
41
- (send nil? #{SKIPPABLE_SELECTORS} $...)}
40
+ {(send {(const nil? :RSpec) nil?} #{SKIPPABLE_SELECTORS} ... (hash $...))
41
+ (send {(const nil? :RSpec) nil?} #{SKIPPABLE_SELECTORS} $...)}
42
42
  PATTERN
43
43
 
44
44
  def_node_matcher :pending_block?, PENDING_EXAMPLES.send_pattern
@@ -30,8 +30,12 @@ module RuboCop
30
30
  (send $(send _ {:exactly :at_least :at_most} (int {1 2})) :times)
31
31
  PATTERN
32
32
 
33
+ def_node_search :stub?, '(send nil? :receive ...)'
34
+
33
35
  def on_send(node)
34
36
  receive_counts(node) do |offending_node|
37
+ return unless stub?(offending_node.receiver)
38
+
35
39
  offending_range = range(node, offending_node)
36
40
 
37
41
  add_offense(
@@ -48,10 +52,9 @@ module RuboCop
48
52
  node.method_name,
49
53
  node.first_argument.source.to_i
50
54
  )
51
- corrector.replace(
52
- range(node.parent, node),
53
- replacement
54
- )
55
+
56
+ original = range(node.parent, node)
57
+ corrector.replace(original, replacement)
55
58
  end
56
59
  end
57
60
 
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RuboCop
4
+ module Cop
5
+ module RSpec
6
+ # This cop checks for calling a block within a stub.
7
+ #
8
+ # @example
9
+ # # bad
10
+ # allow(foo).to receive(:bar) { |&block| block.call(1) }
11
+ #
12
+ # # good
13
+ # expect(foo).to be(:bar).and_yield(1)
14
+ class Yield < Cop
15
+ include RangeHelp
16
+
17
+ MSG = 'Use `.and_yield`.'.freeze
18
+
19
+ def_node_search :method_on_stub?, '(send nil? :receive ...)'
20
+
21
+ def_node_matcher :block_arg, '(args (blockarg $_))'
22
+
23
+ def_node_matcher :block_call?, '(send (lvar %) :call ...)'
24
+
25
+ def on_block(node)
26
+ return unless method_on_stub?(node.send_node)
27
+
28
+ block_arg(node.arguments) do |block|
29
+ if calling_block?(node.body, block)
30
+ add_offense(node, location: block_range(node))
31
+ end
32
+ end
33
+ end
34
+
35
+ def autocorrect(node)
36
+ lambda do |corrector|
37
+ node_range = range_with_surrounding_space(
38
+ range: block_range(node), side: :left
39
+ )
40
+ corrector.replace(node_range, generate_replacement(node.body))
41
+ end
42
+ end
43
+
44
+ private
45
+
46
+ def calling_block?(node, block)
47
+ if node.begin_type?
48
+ node.each_child_node.all? { |child| block_call?(child, block) }
49
+ else
50
+ block_call?(node, block)
51
+ end
52
+ end
53
+
54
+ def block_range(node)
55
+ block_start = node.loc.begin.begin_pos
56
+ block_end = node.loc.end.end_pos
57
+ range_between(block_start, block_end)
58
+ end
59
+
60
+ def generate_replacement(node)
61
+ if node.begin_type?
62
+ node.children.map { |child| convert_block_to_yield(child) }.join
63
+ else
64
+ convert_block_to_yield(node)
65
+ end
66
+ end
67
+
68
+ def convert_block_to_yield(node)
69
+ args = node.arguments
70
+ replacement = '.and_yield'
71
+ replacement += "(#{args.map(&:source).join(', ')})" if args.any?
72
+ replacement
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
@@ -75,3 +75,4 @@ require_relative 'rspec/subject_stub'
75
75
  require_relative 'rspec/unspecified_exception'
76
76
  require_relative 'rspec/verified_doubles'
77
77
  require_relative 'rspec/void_expect'
78
+ require_relative 'rspec/yield'
@@ -4,7 +4,7 @@ module RuboCop
4
4
  module RSpec
5
5
  # Version information for the RSpec RuboCop plugin.
6
6
  module Version
7
- STRING = '1.31.0'.freeze
7
+ STRING = '1.32.0'.freeze
8
8
  end
9
9
  end
10
10
  end
@@ -88,6 +88,36 @@ RSpec.describe RuboCop::Cop::RSpec::FactoryBot::CreateList, :config do
88
88
  include_examples 'autocorrect',
89
89
  '5.times { FactoryGirl.create :user }',
90
90
  'FactoryGirl.create_list :user, 5'
91
+
92
+ bad_code = <<-RUBY
93
+ 3.times do
94
+ create(:user, :trait) { |user| create :account, user: user }
95
+ end
96
+ RUBY
97
+
98
+ good_code = <<-RUBY
99
+ create_list(:user, 3, :trait) { |user| create :account, user: user }
100
+ RUBY
101
+
102
+ include_examples 'autocorrect', bad_code, good_code
103
+
104
+ bad_code = <<-RUBY
105
+ 3.times do
106
+ create(:user, :trait) do |user|
107
+ create :account, user: user
108
+ create :profile, user: user
109
+ end
110
+ end
111
+ RUBY
112
+
113
+ good_code = <<-RUBY
114
+ create_list(:user, 3, :trait) do |user|
115
+ create :account, user: user
116
+ create :profile, user: user
117
+ end
118
+ RUBY
119
+
120
+ include_examples 'autocorrect', bad_code, good_code
91
121
  end
92
122
 
93
123
  context 'when EnforcedStyle is :n_times' do
@@ -10,6 +10,8 @@ RSpec.describe RuboCop::Cop::RSpec::Focus do
10
10
  ^^^^^^^^^^^ Focused spec found.
11
11
  describe 'test', meta: true, focus: true do; end
12
12
  ^^^^^^^^^^^ Focused spec found.
13
+ RSpec.describe 'test', meta: true, focus: true do; end
14
+ ^^^^^^^^^^^ Focused spec found.
13
15
  it 'test', meta: true, focus: true do; end
14
16
  ^^^^^^^^^^^ Focused spec found.
15
17
  xspecify 'test', meta: true, focus: true do; end
@@ -61,6 +63,8 @@ RSpec.describe RuboCop::Cop::RSpec::Focus do
61
63
  ^^^^^^ Focused spec found.
62
64
  describe 'test', :focus do; end
63
65
  ^^^^^^ Focused spec found.
66
+ RSpec.describe 'test', :focus do; end
67
+ ^^^^^^ Focused spec found.
64
68
  xit 'test', :focus do; end
65
69
  ^^^^^^ Focused spec found.
66
70
  context 'test', :focus do; end
@@ -108,10 +112,13 @@ RSpec.describe RuboCop::Cop::RSpec::Focus do
108
112
  RUBY
109
113
  end
110
114
 
115
+ # rubocop:disable RSpec/ExampleLength
111
116
  it 'flags focused block types' do
112
117
  expect_offense(<<-RUBY)
113
118
  fdescribe 'test' do; end
114
119
  ^^^^^^^^^^^^^^^^ Focused spec found.
120
+ RSpec.fdescribe 'test' do; end
121
+ ^^^^^^^^^^^^^^^^^^^^^^ Focused spec found.
115
122
  ffeature 'test' do; end
116
123
  ^^^^^^^^^^^^^^^ Focused spec found.
117
124
  fcontext 'test' do; end
@@ -128,4 +135,5 @@ RSpec.describe RuboCop::Cop::RSpec::Focus do
128
135
  ^^^^^^^^^^^^ Focused spec found.
129
136
  RUBY
130
137
  end
138
+ # rubocop:enable RSpec/ExampleLength
131
139
  end
@@ -82,6 +82,14 @@ RSpec.describe RuboCop::Cop::RSpec::Pending do
82
82
  RUBY
83
83
  end
84
84
 
85
+ it 'flags describe with skip symbol metadata' do
86
+ expect_offense(<<-RUBY)
87
+ RSpec.describe 'test', :skip do
88
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Pending spec found.
89
+ end
90
+ RUBY
91
+ end
92
+
85
93
  it 'flags blocks with pending symbol metadata' do
86
94
  expect_offense(<<-RUBY)
87
95
  it 'test', :pending do
@@ -78,6 +78,12 @@ RSpec.describe RuboCop::Cop::RSpec::ReceiveCounts do
78
78
  RUBY
79
79
  end
80
80
 
81
+ it 'allows exactly(1).times when not called on `receive`' do
82
+ expect_no_offenses(<<-RUBY)
83
+ expect(action).to have_published_event.exactly(1).times
84
+ RUBY
85
+ end
86
+
81
87
  include_examples 'autocorrect',
82
88
  'expect(foo).to receive(:bar).exactly(1).times { true }',
83
89
  'expect(foo).to receive(:bar).once { true }'
@@ -85,4 +91,9 @@ RSpec.describe RuboCop::Cop::RSpec::ReceiveCounts do
85
91
  include_examples 'autocorrect',
86
92
  'expect(foo).to receive(:bar).at_least(2).times { true }',
87
93
  'expect(foo).to receive(:bar).at_least(:twice) { true }'
94
+
95
+ # Does not auto-correct if not part of the RSpec API
96
+ include_examples 'autocorrect',
97
+ 'expect(foo).to have_published_event(:bar).exactly(2).times',
98
+ 'expect(foo).to have_published_event(:bar).exactly(2).times'
88
99
  end
@@ -0,0 +1,80 @@
1
+ RSpec.describe RuboCop::Cop::RSpec::Yield do
2
+ subject(:cop) { described_class.new }
3
+
4
+ it 'flags `block.call`' do
5
+ expect_offense(<<-RUBY)
6
+ allow(foo).to receive(:bar) { |&block| block.call }
7
+ ^^^^^^^^^^^^^^^^^^^^^^^ Use `.and_yield`.
8
+ RUBY
9
+ end
10
+
11
+ it 'flags multiple `block.call`' do
12
+ expect_offense(<<-RUBY)
13
+ allow(foo).to receive(:bar) do |&block|
14
+ ^^^^^^^^^^^ Use `.and_yield`.
15
+ block.call
16
+ block.call
17
+ end
18
+ RUBY
19
+ end
20
+
21
+ it 'flags `block.call` with arguments' do
22
+ expect_offense(<<-RUBY)
23
+ allow(foo).to receive(:bar) { |&block| block.call(1, 2) }
24
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Use `.and_yield`.
25
+ RUBY
26
+ end
27
+
28
+ it 'flags multiple `block.call` with arguments' do
29
+ expect_offense(<<-RUBY)
30
+ allow(foo).to receive(:bar) do |&block|
31
+ ^^^^^^^^^^^ Use `.and_yield`.
32
+ block.call(1)
33
+ block.call(2)
34
+ end
35
+ RUBY
36
+ end
37
+
38
+ it 'flags `block.call` when `receive` is chained' do
39
+ expect_offense(<<-RUBY)
40
+ allow(foo).to receive(:bar).with(anything) { |&block| block.call }
41
+ ^^^^^^^^^^^^^^^^^^^^^^^ Use `.and_yield`.
42
+ RUBY
43
+ end
44
+
45
+ it 'ignores `receive` with no block arguments' do
46
+ expect_no_offenses(<<-RUBY)
47
+ allow(foo).to receive(:bar) { |block| block.call }
48
+ RUBY
49
+ end
50
+
51
+ it 'ignores stub when `block.call` is not the only statement' do
52
+ expect_no_offenses(<<-RUBY)
53
+ allow(foo).to receive(:bar) do |&block|
54
+ result = block.call
55
+ transform(result)
56
+ end
57
+ RUBY
58
+ end
59
+
60
+ include_examples 'autocorrect',
61
+ 'allow(foo).to receive(:bar) { |&block| block.call }',
62
+ 'allow(foo).to receive(:bar).and_yield'
63
+
64
+ include_examples 'autocorrect',
65
+ 'allow(foo).to receive(:bar) { |&block| block.call(1, 2) }',
66
+ 'allow(foo).to receive(:bar).and_yield(1, 2)'
67
+
68
+ bad_code = <<-RUBY
69
+ allow(foo).to receive(:bar) do |&block|
70
+ block.call(1)
71
+ block.call(2)
72
+ end
73
+ RUBY
74
+
75
+ good_code = <<-RUBY
76
+ allow(foo).to receive(:bar).and_yield(1).and_yield(2)
77
+ RUBY
78
+
79
+ include_examples 'autocorrect', bad_code, good_code
80
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubocop-rspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.31.0
4
+ version: 1.32.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Backus
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2019-01-02 00:00:00.000000000 Z
13
+ date: 2019-01-27 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rubocop
@@ -187,6 +187,7 @@ files:
187
187
  - lib/rubocop/cop/rspec/unspecified_exception.rb
188
188
  - lib/rubocop/cop/rspec/verified_doubles.rb
189
189
  - lib/rubocop/cop/rspec/void_expect.rb
190
+ - lib/rubocop/cop/rspec/yield.rb
190
191
  - lib/rubocop/cop/rspec_cops.rb
191
192
  - lib/rubocop/rspec.rb
192
193
  - lib/rubocop/rspec/align_let_brace.rb
@@ -281,6 +282,7 @@ files:
281
282
  - spec/rubocop/cop/rspec/unspecified_exception_spec.rb
282
283
  - spec/rubocop/cop/rspec/verified_doubles_spec.rb
283
284
  - spec/rubocop/cop/rspec/void_expect_spec.rb
285
+ - spec/rubocop/cop/rspec/yield_spec.rb
284
286
  - spec/rubocop/rspec/config_formatter_spec.rb
285
287
  - spec/rubocop/rspec/description_extractor_spec.rb
286
288
  - spec/rubocop/rspec/example_group_spec.rb
@@ -398,6 +400,7 @@ test_files:
398
400
  - spec/rubocop/cop/rspec/unspecified_exception_spec.rb
399
401
  - spec/rubocop/cop/rspec/verified_doubles_spec.rb
400
402
  - spec/rubocop/cop/rspec/void_expect_spec.rb
403
+ - spec/rubocop/cop/rspec/yield_spec.rb
401
404
  - spec/rubocop/rspec/config_formatter_spec.rb
402
405
  - spec/rubocop/rspec/description_extractor_spec.rb
403
406
  - spec/rubocop/rspec/example_group_spec.rb