class RuboCop::Cop::RSpec::InstanceVariable

Checks for instance variable usage in specs.

This cop can be configured with the option `AssignmentOnly` which will configure the cop to only register offenses on instance variable usage if the instance variable is also assigned within the spec

@example

# bad
describe MyClass do
  before { @foo = [] }
  it { expect(@foo).to be_empty }
end

# good
describe MyClass do
  let(:foo) { [] }
  it { expect(foo).to be_empty }
end

@example with AssignmentOnly configuration

# rubocop.yml
# RSpec/InstanceVariable:
#   AssignmentOnly: false

# bad
describe MyClass do
  before { @foo = [] }
  it { expect(@foo).to be_empty }
end

# allowed
describe MyClass do
  it { expect(@foo).to be_empty }
end

# good
describe MyClass do
  let(:foo) { [] }
  it { expect(foo).to be_empty }
end

Constants

EXAMPLE_GROUP_METHODS
MSG

Public Instance Methods

on_block(node) click to toggle source
# File lib/rubocop/cop/rspec/instance_variable.rb, line 64
def on_block(node)
  return unless spec_group?(node)

  ivar_usage(node) do |ivar, name|
    return if inside_dynamic_class?(ivar)
    return if assignment_only? && !ivar_assigned?(node, name)

    add_offense(ivar, location: :expression)
  end
end

Private Instance Methods

assignment_only?() click to toggle source
# File lib/rubocop/cop/rspec/instance_variable.rb, line 81
def assignment_only?
  cop_config['AssignmentOnly']
end
inside_dynamic_class?(node) click to toggle source
# File lib/rubocop/cop/rspec/instance_variable.rb, line 77
def inside_dynamic_class?(node)
  node.each_ancestor(:block).any? { |block| dynamic_class?(block) }
end