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

Inherits:
RuboCop::Cop show all
Includes:
RSpec::Language, RSpec::SpecOnly
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

MESSAGE =
'Use `let` instead of an instance variable'.freeze
EXAMPLE_GROUP_METHODS =
ExampleGroups::ALL + SharedGroups::ALL

Constants included from RSpec::SpecOnly

RSpec::SpecOnly::DEFAULT_CONFIGURATION

Constants included from RSpec::Language

RSpec::Language::ALL

Instance Method Summary collapse

Methods included from RSpec::SpecOnly

#relevant_file?

Instance Method Details

#on_block(node) ⇒ Object



64
65
66
67
68
69
70
71
72
# 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 assignment_only? && !ivar_assigned?(node, name)

    add_offense(ivar, :expression, MESSAGE)
  end
end