我需要在从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)
的内容,因此任何具有这些特定值的对象都会被删除。
答案 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 ...