2016-08-05 66 views
0

我需要在从数据库中检索ActiveRecord模型之前存根。下面是一个简化的例子:尚不存在的RSpec存根对象

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

这似乎是一个X和Y的问题,你能代替告诉使用你想测试,而不是在如何测试它的具体迷路的实际行为? – max

+0

为什么不存根'first_bar'? –

回答

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 ...