尚未存在的RSpec存根对象

时间:2016-08-05 15:07:33

标签: ruby-on-rails ruby rspec

我需要在从db中检索ActiveRecord模型之前对其进行存根。这是一个简单的例子:

model.rb:

class Model < ActiveRecord::Base
  def self.first_bar
    find(id: 1).bar
  end

  def bar
    'not the value I want'
  end
end

model_spec.rb:

let(:model) { Model.create } # => <Model id:1>
before { allow(model).to receive(:bar).and_return('the value I need stubbed') }

it { expect(Model.some_value).to eq('the value I need stubbed') }

显然,此测试失败,因为Model.first_bar中检索的对象与被存根的对象不同。

注意事项:

  • 我无法使用allow_any_instance_of(Model).to receive(:first_bar),因为我在实际测试中的其他位置使用该模型的其他实例。
  • 我无法使用allow(Model).to receive(:first).with(id: 1)因为我的用例太脆弱了。

理想情况下,我需要类似allow_any_instance_of(Model).with_attributes(id: 1)的内容,因此任何具有这些特定值的对象都会被删除。

1 个答案:

答案 0 :(得分:0)

  

我无法使用allow_any_instance_of(Model).to receive(:first_bar)   因为我在真实的其他地方使用该模型的其他实例   测试

这没有意义。 first_bar是一个类方法,因此实例不会调用它。您熟悉类和实例方法之间的区别吗?

我认为allow(Model).to receive(:first_bar)会为您提供您正在寻找的功能。

或者,您可以

allow_(Model).to receive(:find).with(id:1).and_return ...