FactoryGirl + Faker - データベース シード データ内のすべてのオブジェクトに対して同じデータが生成されます

StackOverflow https://stackoverflow.com//questions/25068869

質問

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

そして、中のコードは 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: "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

Faker 自体:

[3] pry(main)> Faker::Internet.email
=> "hobart_purdy@goodwinmills.org"
[4] pry(main)> Faker::Internet.email
=> "pierce_brekke@gislasonrolfson.net"

ここで何が足りないのでしょうか?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 #=> "email1@example.com"
FactoryGirl.create(:user).email #=> "email2@example.com"

Factory Girl のヒント @ から引用 http://arjanvandergaag.nl/blog/factory_girl_tips.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top