ruby on rails - تقوم Faker بإنتاج بيانات مكررة عند استخدامها في factory_girl




ruby-on-rails factory-bot (3)

أحاول ملء بعض البيانات المزيفة في مصنع باستخدام جوهرة Faker:

Factory.define :user do |user|
  user.first_name Faker::Name::first_name
  user.last_name Faker::Name::last_name
  user.sequence(:email) {|n| "user#{n}@blow.com" }
end

على الرغم من أنني أتوقع أن ينتج عن ذلك المستخدمين الذين لديهم أسماء أولية وأسماء مختلفة ، إلا أن كل واحد منهم هو نفسه:

>> Factory(:user)
=> #<User id: 16, email: "[email protected]", created_at: "2011-03-18 18:29:33",     
updated_at: "2011-03-18 18:29:33", first_name: "Bailey", last_name: "Durgan">
>> Factory(:user)
=> #<User id: 17, email: "[email protected]", created_at: "2011-03-18 18:29:39", 
updated_at: "2011-03-18 18:29:39", first_name: "Bailey", last_name: "Durgan">

كيف يمكنني الحصول على جوهرة Faker لإنشاء أسماء جديدة لكل مستخدم وليس فقط إعادة استخدام الأسماء الأصلية؟


إن البديل (الأقل كفاءة) لاستخدام التتابعات عندما يكون لديك التحقق من التفرد في إحدى السمات هو التحقق مما إذا كانت هناك قيمة مقترحة موجودة بالفعل والاستمرار في تجربة أخرى جديدة حتى تكون فريدة من نوعها:

FactoryGirl.define do
  factory :company do
    name do
      loop do
        possible_name = Faker::Company.name
        break possible_name unless Company.exists?(name: possible_name)
      end
    end
  end
end

لاحظ أن Faker قد يظل يوفر بيانات مكررة بسبب الكمية المحدودة من البيانات المزيفة المتاحة.

لأغراض الاختبار البسيطة والحصول على التحقق من صحة التفرد ، استخدمت ما يلي:

sequence(:first_name) {|n| Faker::Name::first_name + " (#{n})"}
sequence(:last_name) {|n| Faker::Name::last_name + " (#{n})"}

Factory.define :user do |user|
  user.first_name { Faker::Name::first_name }
  user.last_name { Faker::Name::last_name }
  user.sequence(:email) {|n| "user#{n}@blow.com" }
end

حاول وضع أقواس حول المزيفين. انظر هذا الرابط





factory-bot