2017-03-07 36 views
0

我有以下的Rails型号:为模型Rspec的隔离测试是建立另一个

class Factory < ApplicationRecord 
    has_many :widget 
    def build_widget! 
    widget = widgets.build 
    widget.verify! # does stuff, could raise exception depending outcome of third party api calls, etc. 
    widget.save! 
    end 
end 

我有以下Rspec的测试设置:

RSpec.describe Factory, type: :model do 
    describe '#build_widget!' do 
    let(:factory) { create(:factory) } 

    it 'creates a new widget' do 
    expect(factory.widgets.count).to eq 0 
    factory.build_new_widget! 
    expect(factory.widgets.count).to eq 1 
    end 
end 

与这一点,我的几个问题努力:

1)我如何隔离工厂测试,所以我不依赖于widget.verify的结果! (我已经在Widget模型的单独规范中介绍过)。因为这个方法在方法内部是硬编码的,所以我在如何设置合适的模拟或双精度上挣扎。

2)测试factory.widgets.count是否是最好的方法?这看起来有点骇人听闻,但我不确定如何正确设定期望值。

回答

0

1)您可以使用RSpec Mocks之前的预期:

before(:each) do 
    allow_any_instance_of(Widget).to receive(:verify!).and_return(true) 
end 

2)将得到更好的跟踪对象的变化:

RSpec.describe Factory, type: :model do 
    describe '#build_widget!' do 
    before(:each) do 
     allow_any_instance_of(Widget).to receive(:verify!).and_return(true) 
    end 

    let(:factory) { create(:factory) } 

    it 'creates a new widget' do 
     expect do 
     factory.build_widget! 
     end.to change { factory.widgets.count }.from(0).to(1) 
    end 
    end 
end 
+0

好,谢谢!这非常合理。 – richleenyc