我在一个我想测试的方法中有Model.some_scope.pluck(:a_field)
之类的声明。
使用rspec-mocks 3.4.0将这个链式方法调用语句的返回值存根的建议方法是什么?我看到stub_chain
和receive_message_chain
都在RSpec网站上列为旧语法。
最诚挚的问候。
答案 0 :(得分:1)
测试该代码最简洁的方法是提取方法,例如
class Model < ActiveRecord::Base
def self.some_scope_fields
some_scope.pluck(:a_field)
end
end
该方法可以在没有链的情况下存根。
然而,有时这样做既不方便也不惯用。例如,在ActiveRecord模型的关联方法上调用create
是惯用的,而不是Demeter违规法则。在那些情况下,
如果您不关心方法参数,请使用receive_message_chain
。 stub_chain
已被弃用; receive_message_chain
不是。 the receive_message_chain
documentation所说的是“在将来的版本中可能会删除对stub_chain奇偶校验的支持”。与该文档相关联的问题清楚地表明,“存根链奇偶校验”意味着with
与receive_message_chain
的使用。所以请使用receive_message_chain
;只是不要使用with
。
如果您关心方法参数,请使用双精度数。例如,对于您提供的代码,
scope = double
allow(scope).to receive(:pluck).with(:a_field) { # return whatever }
allow(Model).to receive(:some_scope).with(no_args) { scope }