具有静态属性的FactoryBot工厂

时间:2019-01-13 17:33:47

标签: ruby-on-rails ruby factory-bot

我想创建一个用于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在每次测试前将数据库清空,但是如果我尝试创建项目列表,则会得到重复属性(具有唯一验证)的错误。

2 个答案:

答案 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,因为它们可以在事务中运行并提供静态值。

所以我要发布此消息,就像有人试图遵循相同的建议那样,这是朝错误的方向前进,因为这是固定装置的用途。