我有以下导轨模型:
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)如何隔离工厂测试,因此我不依赖widefify的结果!(我已在小部件模型的单独规格下介绍)。因为该方法在方法内部进行了硬编码,所以我正在为如何设置适当的模拟或双重设计而苦苦挣扎。
2)测试工厂。这似乎有点黑,但我不确定如何正确设置期望。
1)您可以在期望之前使用RSPEC模拟:
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