私はFactoryGirlとFakerを使用して_seeds.rb
_ファイルにユーザーオブジェクトを生成していますが、何らかの理由でまったく同じユーザーが作成されており、Eメールの一意性の検証のために_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
_
そして、_seeds.rb
_ファイルのコード:
_#seeds.rb
Rand(5..11).times { FactoryGirl.create(:user) }
_
エラー:
_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: "[email protected]", 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
_
フェイカー自体:
_[3] pry(main)> Faker::Internet.email
=> "[email protected]"
[4] pry(main)> Faker::Internet.email
=> "[email protected]"
_
ここで何が欠けていますか? FakerがFactoryGirlを通じて使用されるときに毎回同じデータを生成するのはなぜですか?
作成したインスタンスごとに値を再評価する場合は、ブロックを渡す必要があります。
の代わりに
email Faker::Internet.email
やってみて...
email { Faker::Internet.email }
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 #=> "[email protected]"
FactoryGirl.create(:user).email #=> "[email protected]"
Factory Girlのヒント@ http://arjanvandergaag.nl/blog/factory_girl_tips.html から取得