如何让工厂只为 Rspec 中的所有测试创建一次数据
How to have factory only create data one time for all tests in Rspec
这是我的代码的一个简化版本:
frozen_string_literal: true
RSpec.describe MyObject do
let!(:my_object) { create(:my_object, name: 'This Name') }
let!(:my_ojbect_2) { create(:my_object_2, obj: my_object) }
describe '#my_data' do
subject { my_object.my_data }
context 'when a' do
...
...
it { is_expected.to eq expected_value }
end
context 'when b' do
...
...
it { is_expected.to eq expected_value }
end
context 'when' do
...
...
it { byebug }
end
end
end
当测试停止在byebug时,我注意到my_object在数据库中创建了多次。有没有办法让 my_object 只创建一次?
如果测试对象的多个副本在测试之间持续存在,这会给您的测试带来巨大的问题,并且不能依赖它们。
你必须在测试之间有一个干净的石板。有很多方法可以做到这一点,但它可能会因工厂、固定装置、交易固定装置等而变得复杂。
我个人几乎总是使用数据库清理器。
这是我的代码的一个简化版本:
frozen_string_literal: true
RSpec.describe MyObject do
let!(:my_object) { create(:my_object, name: 'This Name') }
let!(:my_ojbect_2) { create(:my_object_2, obj: my_object) }
describe '#my_data' do
subject { my_object.my_data }
context 'when a' do
...
...
it { is_expected.to eq expected_value }
end
context 'when b' do
...
...
it { is_expected.to eq expected_value }
end
context 'when' do
...
...
it { byebug }
end
end
end
当测试停止在byebug时,我注意到my_object在数据库中创建了多次。有没有办法让 my_object 只创建一次?
如果测试对象的多个副本在测试之间持续存在,这会给您的测试带来巨大的问题,并且不能依赖它们。
你必须在测试之间有一个干净的石板。有很多方法可以做到这一点,但它可能会因工厂、固定装置、交易固定装置等而变得复杂。
我个人几乎总是使用数据库清理器。