我有以下Rails模型:
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)如何隔离Factory测试,因此我不依赖于widget.verify的结果! (我在Widget模型的单独规范中介绍过)。因为这个方法在方法中是硬编码的,所以我正在努力设置一个正确的模拟或双重。
2)测试factory.widgets.count是最好的方法吗?这看起来有些过时,但我不确定如何正确设定期望。
答案 0 :(得分: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