ben*_*itr 26 ruby-on-rails factory-bot
如何创建同一类的多个记录或多个工厂?
我试过了:
Factory.define :user do |user|
user.email "someuser@somesite.com"
user.password "somepassword"
user.email "another_existing_user@somesite.com"
user.password "somepassword"
end
Run Code Online (Sandbox Code Playgroud)
和
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
Run Code Online (Sandbox Code Playgroud)
但它不起作用 - Attribute already defined: email.
ace*_*reg 43
这是一个较旧的问题和答案,但这是我在Google上找到的第一个结果,所以我想我会在标题构建或创建多个记录下的文档中添加以下内容:
created_users = FactoryGirl.create_list(:user, 25) #creates 25 users
twenty_year_olds = FactoryGirl.build_list(:user, 25, date_of_birth: 20.years.ago) #builds 25 users, sets their date_of_birth
Run Code Online (Sandbox Code Playgroud)
如果您想在rails控制台中运行它,请在此处考虑以下答案:https://stackoverflow.com/a/23580836/4880924
在我刚刚引用的示例中,每个用户都有一个不同的用户名,前提sequence是在工厂定义中使用(参见上面的Mike Lewis答案).
Den*_*nis 32
如果您希望来自同一(基础)工厂的记录具有不同的值,则有几个选项.
A)覆盖已定义的属性
factory :post, aliases: [:approved_post] do
title "A title"
approved true
end
approved_post = create(:approved_post)
unapproved_post = create(:post, approved: false)
Run Code Online (Sandbox Code Playgroud)
B)继承
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)
Run Code Online (Sandbox Code Playgroud)
C)序列
factory :user do
sequence(:email, 1000) { |n| "person#{n}@example.com" }
end
Run Code Online (Sandbox Code Playgroud)
D)特征
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)
Run Code Online (Sandbox Code Playgroud)
可以组合这些方法.此示例使用列表和带有序列和重写的对.
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)
Run Code Online (Sandbox Code Playgroud)
我希望尽可能使用特征,我觉得它们很灵活.
Mik*_*wis 23
使用工厂有两个步骤,第一步是定义它们,第二步是使用它们.
1)定义他们:
Factory.define :user do |u|
u.sequence(:email) { |n| "mike#{n}@awesome.com"}
u.password "password123"
end
Run Code Online (Sandbox Code Playgroud)
2)使用他们:
一个例子是在规范中使用它们:
@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
Run Code Online (Sandbox Code Playgroud)
我会看这个Railscast以获得更好的感觉.
| 归档时间: |
|
| 查看次数: |
18682 次 |
| 最近记录: |