使用FactoryBot构建具有trait的对象列表

34

我在测试中使用factory_bot创建对象,这是我的一个工厂示例:

factory :user do
  name "John"
  surname "Doe"

  trait :with_photo do
    ignore do
      photo_count 1
    end

    after(:create) do |user, evaluator|
      FactoryBot.create_list(:photo, evaluator.photo_count)
    end
  end
end

所以我可以创建一个带有照片的用户,例如:

FactoryBot.create(:user, :with_photo)

或者没有照片:

FactoryBot.create(:user) 

或者创建一个用户列表:

FactoryBot.build_list(:user, 5)

如果我想创建具有特性(特性为:with_photo)的用户列表,并且我想要创建五个带照片的用户,该怎么办?

注意:FactoryBot 以前被称为 FactoryGirl。

2个回答

78

对我也不起作用。直到我意识到我使用了复数形式的“users”。 - juliangonzalez
2
似乎很重要的是在计数后首先添加特征,然后指定其他属性。如果你在tag:之后添加:with_photo,它将无法工作。FactoryGirl.build_list(:user, 5, :with_photo, tag: 'value') - Jesper Grann Laursen

8
您可以将多个 traits 传递给 create_listbuild_list。例子如下:
factory :user do
  name { "Friendly User" }

  trait :male do
    name { "John Doe" }
    gender { "Male" }
  end

  trait :admin do
    admin { true }
  end
end

# creates 3 admin users with gender "Male" and name "Jon Snow" using the admin and male trait
build_list(:user, 3, :admin, :male, name: "Jon Snow")
create_list(:user, 3, :admin, :male, name: "Jon Snow")

请确保traits在您希望创建的记录数量之后,最后一个参数是一个哈希表,可以覆盖记录属性。
更多有关traits的官方文档,请参见此处

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接