class RuboCop::Cop::RSpec::RepeatedExampleGroupBody
Check for repeated describe and context block body.
@example
# bad describe 'cool feature x' do it { cool_predicate } end describe 'cool feature y' do it { cool_predicate } end # good describe 'cool feature' do it { cool_predicate } end describe 'another cool feature' do it { another_predicate } end # good context 'when case x', :tag do it { cool_predicate } end context 'when case y' do it { cool_predicate } end # good context Array do it { is_expected.to respond_to :each } end context Hash do it { is_expected.to respond_to :each } end
Constants
- MSG
Public Instance Methods
on_begin(node)
click to toggle source
# File lib/rubocop/cop/rspec/repeated_example_group_body.rb, line 68 def on_begin(node) return unless several_example_groups?(node) repeated_group_bodies(node).each do |group, repeats| add_offense(group, message: message(group, repeats)) end end
Private Instance Methods
add_repeated_lines(groups)
click to toggle source
# File lib/rubocop/cop/rspec/repeated_example_group_body.rb, line 89 def add_repeated_lines(groups) repeated_lines = groups.map(&:first_line) groups.map { |group| [group, repeated_lines - [group.first_line]] } end
message(group, repeats)
click to toggle source
# File lib/rubocop/cop/rspec/repeated_example_group_body.rb, line 98 def message(group, repeats) format(MSG, group: group.method_name, loc: repeats) end
repeated_group_bodies(node)
click to toggle source
# File lib/rubocop/cop/rspec/repeated_example_group_body.rb, line 78 def repeated_group_bodies(node) node .children .select { |child| example_group_with_body?(child) } .reject { |child| skip_or_pending?(child) } .group_by { |group| signature_keys(group) } .values .reject(&:one?) .flat_map { |groups| add_repeated_lines(groups) } end
signature_keys(group)
click to toggle source
# File lib/rubocop/cop/rspec/repeated_example_group_body.rb, line 94 def signature_keys(group) [metadata(group), body(group), const_arg(group)] end