如何使用RSpec模拟消息链接?

时间:2016-06-07 15:47:42

标签: ruby-on-rails ruby testing rspec rspec-mocks

我在一个我想测试的方法中有Model.some_scope.pluck(:a_field)之类的声明。

使用rspec-mocks 3.4.0将这个链式方法调用语句的返回值存根的建议方法是什么?我看到stub_chainreceive_message_chain都在RSpec网站上列为旧语法。

最诚挚的问候。

1 个答案:

答案 0 :(得分:1)

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

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

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

然而,有时这样做既不方便也不惯用。例如,在ActiveRecord模型的关联方法上调用create是惯用的,而不是Demeter违规法则。在那些情况下,

  • 如果您不关心方法参数,请使用receive_message_chainstub_chain已被弃用; receive_message_chain不是。 the receive_message_chain documentation所说的是“在将来的版本中可能会删除对stub_chain奇偶校验的支持”。与该文档相关联的问题清楚地表明,“存根链奇偶校验”意味着withreceive_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 }