FactoryGirl + Faker - يتم إنشاء نفس البيانات لكل كائن في بيانات قاعدة البيانات
-
26-12-2019 - |
سؤال
أنا أستخدم 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