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.

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)

63
64
65
66
67
68
69
70
71
72
# File 'lib/rubocop/cop/rspec/subject_stub.rb', line 63

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


80
81
82
83
84
85
86
# File 'lib/rubocop/cop/rspec/subject_stub.rb', line 80

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


45
46
47
48
49
50
# File 'lib/rubocop/cop/rspec/subject_stub.rb', line 45

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