six*_*bit 38 database ruby-on-rails seeding faker factory-bot
我正在使用FactoryGirl和Faker在我的seeds.rb
文件中生成用户对象但由于某种原因,正在创建完全相同的用户并且rake db:seed
由于电子邮件唯一性验证而失败.
用户工厂:
#users.rb
require 'faker'
FactoryGirl.define do
factory :user do
first_name Faker::Name.first_name
last_name Faker::Name.last_name
phone Faker::PhoneNumber.cell_phone
email Faker::Internet.email
password "password"
password_confirmation "password"
end
end
Run Code Online (Sandbox Code Playgroud)
和seeds.rb
文件中的代码:
#seeds.rb
rand(5..11).times { FactoryGirl.create(:user) }
Run Code Online (Sandbox Code Playgroud)
错误:
ActiveRecord::RecordInvalid: Validation failed: Email has already been taken
如果我打开控制台并使用FactoryGirl.create(:user)
我得到相同的结果......相反的对象正在反复创建,即使我只运行Faker::Internet.email
几次我会收到几封电子邮件.
工厂女工:
[1] pry(main)> FactoryGirl.create(:user)
...
=> #<User id: 3, first_name: "Osvaldo", last_name: "Wunsch", email: "willy@damore.net", phone: "(912)530-4949 x64848", created_at: "2014-07-31 20:57:27", updated_at: "2014-07-31 20:57:27", encrypted_password: "$2a$10$mxWC7yLYR0m/Sw8MO6Lyru.xuTHCdCEuM9Orx3LXGApF...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil>
[2] pry(main)> FactoryGirl.create(:user)
...
ActiveRecord::RecordInvalid: Validation failed: Email has already been taken
Run Code Online (Sandbox Code Playgroud)
Faker本身:
[3] pry(main)> Faker::Internet.email
=> "hobart_purdy@goodwinmills.org"
[4] pry(main)> Faker::Internet.email
=> "pierce_brekke@gislasonrolfson.net"
Run Code Online (Sandbox Code Playgroud)
我在这里错过了什么?为什么Faker每次通过FactoryGirl使用时都会产生相同的数据?
Ste*_*zyn 105
如果要为创建的每个实例重新评估值,则需要传递一个块.
代替
email Faker::Internet.email
Run Code Online (Sandbox Code Playgroud)
尝试...
email { Faker::Internet.email }
Run Code Online (Sandbox Code Playgroud)
Epi*_*ene 10
使用Faker获取唯一性传递属性可能是反模式.在测试中让Faker的半随机输出也可能是一个坏主意 - 如果有时测试失败并且你只是因为Faker咳出一个你没想到的价值而疯狂追逐?
最近我一直在使用FactoryGirl的序列来获得可预测但唯一性的传递值.
FactoryGirl.define do
factory :user do
sequence(:first_name, 1) { |n| "John#{n}" }
sequence(:last_name, 1) { |n| "Doe#{n}" }
sequence(:phone, 1) { |n| (111111111+n).to_s }
sequence(:email, 1) { |n| "email#{n}@example.com" }
password "password"
password_confirmation "password"
end
end
FactoryGirl.create(:user).email #=> "email1@example.com"
FactoryGirl.create(:user).email #=> "email2@example.com"
Run Code Online (Sandbox Code Playgroud)
取自Factory Girl提示@ http://arjanvandergaag.nl/blog/factory_girl_tips.html
归档时间: |
|
查看次数: |
11514 次 |
最近记录: |