class RuboCop::Cop::RSpec::SingleArgumentMessageChain
allow(foo).to receive(“bar.baz”)
allow(foo).to receive(:bar, :baz)
# also good
allow(foo).to receive(:bar).and_return(42)
# good
allow(foo).to receive_message_chain(:bar).and_return(42)
# bad
@example
Checks that chains of messages contain more than one element.
def autocorrect(node)
def autocorrect(node) lambda do |corrector| corrector.replace(node.loc.selector, replacement(node.method_name)) message_chain(node) do |arg| autocorrect_hash_arg(corrector, arg) if single_key_hash?(arg) end end end
def autocorrect_hash_arg(corrector, arg)
def autocorrect_hash_arg(corrector, arg) key, value = *arg.children.first corrector.replace(arg.loc.expression, key_to_arg(key)) corrector.insert_after(arg.parent.loc.end, ".and_return(#{value.source})") end
def key_to_arg(node)
def key_to_arg(node) key, = *node node.sym_type? ? ":#{key}" : node.source end
def message(node)
def message(node) method = node.method_name format(MSG, recommended: replacement(method), called: method) end
def on_send(node)
def on_send(node) message_chain(node) do |arg| return if arg.to_s.include?('.') return if arg.hash_type? && !single_key_hash?(arg) add_offense(node, :selector) end end
def replacement(method)
def replacement(method) method.equal?(:receive_message_chain) ? 'receive' : 'stub' end