首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在factory Girl中创建/构建多个Factory实例?

如何在factory Girl中创建/构建多个Factory实例?
EN

Stack Overflow用户
提问于 2011-04-01 14:14:56
回答 4查看 23.2K关注 0票数 28

如何创建同一类的多条记录或多个工厂?

我试过了:

代码语言:javascript
复制
Factory.define :user do |user|
  user.email "someuser@somesite.com"
  user.password "somepassword"

  user.email "another_existing_user@somesite.com"
  user.password "somepassword"
end

代码语言:javascript
复制
Factory.define :user do |user|
  user.email "someuser@somesite.com"
  user.password "somepassword"
end

Factory.define :user do |user|
  user.email "another_existing_user@somesite.com"
  user.password "somepassword"
end

但它不起作用-- Attribute already defined: email

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-04-01 14:18:43

使用工厂有两个步骤,第一步是定义工厂,第二步是使用工厂。

1)定义它们:

代码语言:javascript
复制
Factory.define :user do |u|
  u.sequence(:email) { |n| "mike#{n}@awesome.com"}
  u.password "password123"
end

2)使用它们:

例如,在规范中使用它们:

代码语言:javascript
复制
 @user1 = Factory(:user) #has an email of mike1@awesome.com
 @user2 = Factory(:user) # has an email of mike2@awesome.com due to sequences in FG

我会看这个Railscast,以便对它有更好的感觉。

票数 23
EN

Stack Overflow用户

发布于 2013-06-21 02:00:48

这是一个较旧的问题和答案,但这是我在谷歌上找到的第一个结果,所以我想我应该从标题为构建或创建多个记录docs中添加以下内容

代码语言:javascript
复制
created_users = FactoryBot.create_list(:user, 25)  #creates 25 users

twenty_year_olds = FactoryBot.build_list(:user, 25, date_of_birth: 20.years.ago)  #builds 25 users, sets their date_of_birth

如果您希望在rails控制台中运行此命令,请考虑以下答案:https://stackoverflow.com/a/23580836/4880924

在我刚才引用的示例中,如果在工厂定义中使用了sequence,每个用户都将有一个不同的用户名(参见上面Mike Lewis的回答)。

票数 49
EN

Stack Overflow用户

发布于 2014-06-19 22:35:01

如果您希望来自同一(基础)工厂的记录具有不同的值,则有几个选项。

A)覆盖定义的属性

代码语言:javascript
复制
factory :post, aliases: [:approved_post] do
  title "A title"
  approved true
end

approved_post = create(:approved_post)
unapproved_post = create(:post, approved: false)

B)继承

代码语言:javascript
复制
factory :post do
  title "A title"

  factory :approved_post do
    approved true
  end

  factory :unapproved_post do
    approved false
  end
end

approved_post = create(:approved_post)
unapproved_post = create(:unapproved_post)

C)序列

代码语言:javascript
复制
factory :user do
  sequence(:email, 1000) { |n| "person#{n}@example.com" }
end

D)特征

代码语言:javascript
复制
factory :post do
  title "My awesome title"

  trait(:approved) { approved true }

  trait(:unapproved) { approved false }

  trait :with_comments do
    after(:create) do |instance|
      create_list :comment, 2, post: instance
    end
  end

  factory :approved_post_with_comments, traits: [:approved, :with_comments]
end

approved_post_with_comments = create(:approved_post_with_comments)
unapproved_post_with_no_comments = create(:post, :unapproved, title: "Test")
post_with_title = build(:post)

这些方法可以组合在一起。此示例使用带有序列和重写的列表和对。

代码语言:javascript
复制
factory :user do
  sequence(:username) { |n| "user#{n}" }
  date_of_birth Date.today
end

# Build a pair and a list of users.
two_newborns     = build_pair(:user)
ten_young_adults = build_list(:user, 10, date_of_birth: 20.years.ago)

# Create a pair and a list of users.
two_young_adults = create_pair(:user, date_of_birth: 20.years.ago)
ten_newborns     = create_list(:user, 10)

我更喜欢在任何可能的情况下使用特征,我发现它们很灵活。

票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5509790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档