2

我有一个声明,就像Model.some_scope.pluck(:a_field)我想测试的方法一样。

我用 rspec-mocks 3.4.0 存根这个链式方法调用语句的返回值的推荐方法是什么?我看到了,stub_chain并且receive_message_chain在 RSpec 网站上都被列为旧语法。

此致。

4

1 回答 1

3

测试该代码的最简洁方法是提取一个方法,例如

class Model < ActiveRecord::Base
  def self.some_scope_fields
    some_scope.pluck(:a_field)
  end
end

该方法可以在没有链的情况下被存根。

但是,有时这样做既不方便也不习惯。例如,调用createActiveRecord 模型的关联方法是惯用的,而不是违反 Demeter 法则。在那些情况下,

  • 如果您不关心方法参数,请使用receive_message_chain. stub_chain已弃用;receive_message_chain不是。文档所说的是“未来版本可能会删除对 stub_chain 奇偶校验的支持” receive_message_chain从该文档链接到的问题清楚地表明“存根链奇偶校验”意味着使用withwith 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 }
    
于 2016-06-07T19:31:26.850 回答