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