class RuboCop::Cop::RSpec::MessageSpies

Checks that message expectations are set using spies.

This cop can be configured in your configuration using the ‘EnforcedStyle` option and supports `–auto-gen-config`.

@example ‘EnforcedStyle: have_received` (default)

# bad
expect(foo).to receive(:bar)
do_something

# good
allow(foo).to receive(:bar) # or use instance_spy
do_something
expect(foo).to have_received(:bar)

@example ‘EnforcedStyle: receive`

# bad
allow(foo).to receive(:bar)
do_something
expect(foo).to have_received(:bar)

# good
expect(foo).to receive(:bar)
do_something

Constants

MSG_HAVE_RECEIVED
MSG_RECEIVE
RESTRICT_ON_SEND

Public Instance Methods

on_send(node) click to toggle source
# File lib/rubocop/cop/rspec/message_spies.rb, line 54
def on_send(node)
  receive_message_matcher(node) do |receiver, message_matcher|
    return correct_style_detected if preferred_style?(message_matcher)

    add_offense(
      message_matcher.loc.selector,
      message: error_message(receiver)
    ) { opposite_style_detected }
  end
end

Private Instance Methods

error_message(receiver) click to toggle source
# File lib/rubocop/cop/rspec/message_spies.rb, line 77
def error_message(receiver)
  case style
  when :receive
    MSG_RECEIVE
  when :have_received
    format(MSG_HAVE_RECEIVED, source: receiver.source)
  end
end
preferred_style?(expectation) click to toggle source
# File lib/rubocop/cop/rspec/message_spies.rb, line 73
def preferred_style?(expectation)
  expectation.method_name.equal?(style)
end
receive_message_matcher(node) { |receiver, match| ... } click to toggle source
# File lib/rubocop/cop/rspec/message_spies.rb, line 67
def receive_message_matcher(node)
  return unless (receiver = message_expectation(node))

  receive_message(node) { |match| yield(receiver, match) }
end