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

Inherits:
Base
  • Object
show all
Includes:
TopLevelGroup
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: true

# 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 =
'Avoid instance variables - use let, ' \
'a method call, or a local variable (if possible).'

Constants included from TopLevelGroup

TopLevelGroup::DEPRECATED_MODULE_METHOD_WARNING

Instance Method Summary collapse

Methods included from TopLevelGroup

#on_new_investigation, #top_level_groups

Methods inherited from Base

inherited, #on_new_investigation

Methods included from RSpec::Language

#example?, #example_group?, #example_group_with_body?, #explicit_rspec?, #hook?, #include?, #let?, #rspec?, #shared_group?, #spec_group?, #subject?

Instance Method Details

#custom_matcher?(node) ⇒ Object



60
61
62
63
64
65
# File 'lib/rubocop/cop/rspec/instance_variable.rb', line 60

def_node_matcher :custom_matcher?, "(block {\n  (send nil? :matcher sym)\n  (send (const (const nil? :RSpec) :Matchers) :define sym)\n} ...)\n"

#dynamic_class?(node) ⇒ Object



55
56
57
# File 'lib/rubocop/cop/rspec/instance_variable.rb', line 55

def_node_matcher :dynamic_class?, "(block (send (const nil? :Class) :new ...) ...)\n"

#ivar_assigned?(node) ⇒ Object



71
# File 'lib/rubocop/cop/rspec/instance_variable.rb', line 71

def_node_search :ivar_assigned?, '(ivasgn % ...)'

#ivar_usage(node) ⇒ Object



68
# File 'lib/rubocop/cop/rspec/instance_variable.rb', line 68

def_node_search :ivar_usage, '$(ivar $_)'

#on_top_level_group(node) ⇒ Object



73
74
75
76
77
78
79
80
# File 'lib/rubocop/cop/rspec/instance_variable.rb', line 73

def on_top_level_group(node)
  ivar_usage(node) do |ivar, name|
    next if valid_usage?(ivar)
    next if assignment_only? && !ivar_assigned?(node, name)

    add_offense(ivar)
  end
end