2017-03-07 40 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