Class: RuboCop::Cop::RSpec::InstanceVariable

Inherits:
Cop
  • Object
show all
Defined in:
lib/rubocop/cop/rspec/instance_variable.rb

Overview

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

Examples:

# 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

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

Constant Summary collapse

MSG =
'Replace instance variable with local variable or `let`.'
EXAMPLE_GROUP_METHODS =
ExampleGroups::ALL + SharedGroups::ALL

Constants inherited from Cop

Cop::DEFAULT_CONFIGURATION, Cop::DEFAULT_PATTERN_RE

Constants included from RSpec::Language

RSpec::Language::ALL, RSpec::Language::RSPEC

Instance Method Summary collapse

Methods inherited from Cop

inherited, #relevant_file?

Instance Method Details

#on_block(node) ⇒ Object



64
65
66
67
68
69
70
71
72
73
# 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