Class: RuboCop::Cop::RSpec::SubjectStub

Inherits:
Base
  • Object
show all
Includes:
TopLevelGroup
Defined in:
lib/rubocop/cop/rspec/subject_stub.rb

Overview

Checks for stubbed test subjects.

Examples:

# bad
describe Article do
  subject(:article) { Article.new }

  it 'indicates that the author is unknown' do
    allow(article).to receive(:author).and_return(nil)
    expect(article.description).to include('by an unknown author')
  end
end

# good
describe Article do
  subject(:article) { Article.new(author: nil) }

  it 'indicates that the author is unknown' do
    expect(article.description).to include('by an unknown author')
  end
end

See Also:

Constant Summary collapse

MSG =
'Do not stub methods of the object under test.'

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::NodePattern

#block_pattern, #send_pattern

Instance Method Details

#message_expectation?(node, method_name) ⇒ Object

Match ‘allow` and `expect(…).to receive`

Examples:

source that matches

allow(foo).to  receive(:bar)
allow(foo).to  receive(:bar).with(1)
allow(foo).to  receive(:bar).with(1).and_return(2)
expect(foo).to receive(:bar)
expect(foo).to receive(:bar).with(1)
expect(foo).to receive(:bar).with(1).and_return(2)


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

def_node_matcher :message_expectation?, <<-PATTERN
  (send
    {
      (send nil? { :expect :allow } (send nil? {% :subject}))
      (send nil? :is_expected)
    }
    #Runners.all
    #message_expectation_matcher?
  )
PATTERN

#on_top_level_group(node) ⇒ Object



90
91
92
93
94
95
96
# File 'lib/rubocop/cop/rspec/subject_stub.rb', line 90

def on_top_level_group(node)
  @explicit_subjects = find_all_explicit_subjects(node)

  find_subject_expectations(node) do |stub|
    add_offense(stub)
  end
end

#subject(node) {|Symbol| ... } ⇒ Object

Find a named or unnamed subject definition

Examples:

anonymous subject

subject(parse('subject { foo }').ast) do |name|
  name # => :subject
end

named subject

subject(parse('subject(:thing) { foo }').ast) do |name|
  name # => :thing
end

Parameters:

  • node (RuboCop::AST::Node)

Yields:

  • (Symbol)

    subject name



55
56
57
58
59
60
# File 'lib/rubocop/cop/rspec/subject_stub.rb', line 55

def_node_matcher :subject, <<-PATTERN
    (block
      (send nil?
        {:subject (sym $_) | $:subject}
      ) args ...)
PATTERN