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