class RuboCop::Cop::RSpec::OverwritingSetup

Checks if there is a let/subject that overwrites an existing one.

@example

# bad
let(:foo) { bar }
let(:foo) { baz }

subject(:foo) { bar }
let(:foo) { baz }

let(:foo) { bar }
let!(:foo) { baz }

# good
subject(:test) { something }
let(:foo) { bar }
let(:baz) { baz }
let!(:other) { other }

Constants

MSG

Public Instance Methods

on_block(node) click to toggle source
# File lib/rubocop/cop/rspec/overwriting_setup.rb, line 30
def on_block(node)
  return unless example_group_with_body?(node)

  find_duplicates(node.body) do |duplicate, name|
    add_offense(
      duplicate,
      location: :expression,
      message: format(MSG, name: name)
    )
  end
end

Private Instance Methods

common_setup?(node) click to toggle source
# File lib/rubocop/cop/rspec/overwriting_setup.rb, line 59
def common_setup?(node)
  return false unless setup?(node)

  # Search only for setup with basic_literal arguments (e.g. :sym, :str)
  # or no arguments at all.
  node.send_node.arguments.all?(&:basic_literal?)
end
find_duplicates(node) { |child, name| ... } click to toggle source
# File lib/rubocop/cop/rspec/overwriting_setup.rb, line 44
def find_duplicates(node)
  setup_expressions = Set.new
  node.each_child_node(:block) do |child|
    next unless common_setup?(child)

    name = if child.send_node.arguments?
             first_argument_name(child.send_node).to_sym
           else
             :subject
           end

    yield child, name unless setup_expressions.add?(name)
  end
end