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

الكذب في حد ذاته:

[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"

مأخوذة من نصائح فتاة المصنع @ http://arjanvandergaag.nl/blog/factory_girl_tips.html

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top