【发布时间】:2019-01-13 17:33:47
【问题描述】:
我想为 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 将数据库清空,但如果我尝试创建项目列表,我会收到重复属性(具有唯一验证)的错误。
【问题讨论】:
-
使用固定值实际上只是意味着您将工厂用作固定装置。不用写
expect(foo.bar).to eq 'baz',你可以写expect(foo.bar).to eq factory_instance.bar,这意味着你不再有规范和工厂之间的紧密耦合,这是一件好事。 -
如果id是静态的,为什么不设置user_id而不是user呢?使用与静态用户 ID 相同的固定字符串
标签: ruby-on-rails ruby factory-bot