我想创建一个用于XML序列化的集成测试,该测试将从数据库中检索数据,然后再创建XML文件。 我需要有一些具有静态属性的工厂,即它们总是具有相同的值,以允许对生成的XML设置期望。
例如,在我的User
工厂中,我有:
factory :static_user, class: User do
id { '78474912-7728-4478-8810-151a1347d546' }
role { :admin }
email { 'john.root@mail.com' }
password { 'password' }
password_confirmation { 'password' }
created_at { Time.parse 'Wed, 26 Sep 2018 11:06:59 UTC +00:00' }
updated_at { Time.parse 'Wed, 26 Sep 2018 11:06:59 UTC +00:00' }
end
尽管当我尝试在另一个工厂中将其用作关联时,我仍需要使用自定义初始化将其包装起来:
FactoryBot.define do
factory :static_order, class: Order do
association :user, factory: :static_user do
initialize_with { User.find_or_initialize_by(build(:static_user)) }
end
end
end
如何避免这种情况?
我可以使用DatabaseCleaner
gem在每次测试前将数据库清空,但是如果我尝试创建项目列表,则会得到重复属性(具有唯一验证)的错误。
答案 0 :(得分:0)
恐怕需要为每个User
创建一个新的create(:static_order)
。
在创建多个用户时,在工厂中设置id
会中断。您可以改用序列,也可以在实例化用户时自行设置id,以便仍然控制id。如果您希望订单共享同一用户,则需要显式传递它们。
let(:user) { create(:user, id: '78474912-7728-4478-8810-151a1347d546') }
let!(:order1) { create(:static_order, user: user) }
let!(:order2) { create(:static_order, user: user) }
答案 1 :(得分:0)
使用@max引用,最后使用了有意义的Fixture,因为它们可以在事务中运行并提供静态值。
所以我要发布此消息,就像有人试图遵循相同的建议那样,这是朝错误的方向前进,因为这是固定装置的用途。