class RuboCop::Cop::RSpec::ReturnFromStub

Checks for consistent style of stub's return setting.

Enforces either `and_return` or block-style return in the cases where the returned value is constant. Ignores dynamic returned values are the result would be different

This cop can be configured using the `EnforcedStyle` option

@example `EnforcedStyle: block`

# bad
allow(Foo).to receive(:bar).and_return("baz")
expect(Foo).to receive(:bar).and_return("baz")

# good
allow(Foo).to receive(:bar) { "baz" }
expect(Foo).to receive(:bar) { "baz" }
# also good as the returned value is dynamic
allow(Foo).to receive(:bar).and_return(bar.baz)

@example `EnforcedStyle: and_return`

# bad
allow(Foo).to receive(:bar) { "baz" }
expect(Foo).to receive(:bar) { "baz" }

# good
allow(Foo).to receive(:bar).and_return("baz")
expect(Foo).to receive(:bar).and_return("baz")
# also good as the returned value is dynamic
allow(Foo).to receive(:bar) { bar.baz }

Constants

MSG_AND_RETURN
MSG_BLOCK

Public Instance Methods

on_send(node) click to toggle source
# File lib/rubocop/cop/rspec/return_from_stub.rb, line 47
def on_send(node)
  if style == :block
    check_and_return_call(node)
  elsif node.method_name == :receive
    check_block_body(node)
  end
end

Private Instance Methods

check_and_return_call(node) click to toggle source
# File lib/rubocop/cop/rspec/return_from_stub.rb, line 57
def check_and_return_call(node)
  and_return_value(node) do |args|
    unless dynamic?(args)
      add_offense(
        node,
        location: :expression,
        message: MSG_BLOCK
      )
    end
  end
end
check_block_body(node) click to toggle source
# File lib/rubocop/cop/rspec/return_from_stub.rb, line 69
def check_block_body(node)
  block = node.each_ancestor(:block).first
  return unless block

  _receiver, _args, body = *block
  unless body && dynamic?(body) # rubocop:disable Style/GuardClause
    add_offense(
      node,
      location: :expression,
      message: MSG_AND_RETURN
    )
  end
end
dynamic?(node) click to toggle source
# File lib/rubocop/cop/rspec/return_from_stub.rb, line 83
def dynamic?(node)
  !node.recursive_literal?
end