Faker, factory_girl'de kullanıldığında yinelenen veriler üretiyor


86

Faker mücevherini kullanarak bir fabrikaya bazı sahte veriler yerleştirmeye çalışıyorum:

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

Ancak bunun farklı ad ve soyadlara sahip kullanıcılar üretmesini beklerken, her biri aynıdır:

>> Factory(:user)
=> #<User id: 16, email: "user7@blow.com", 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: "user8@blow.com", created_at: "2011-03-18 18:29:39", 
updated_at: "2011-03-18 18:29:39", first_name: "Bailey", last_name: "Durgan">

Faker cevherinin her kullanıcı için yeni isimler oluşturmasını ve orijinal isimleri yeniden kullanmasını nasıl sağlayabilirim?


1
Sadece karanlıkta bir atış, ama gibi bir şey kullanmayı denediniz user.sequence(:first_name} {|n| Faker::Name::first_name}mi? FactoryGirl muhtemelen Faker çağrınızı "fikstürlerinizi" yüklerken değerlendiriyordur. Kullanma sequence param,&blockyöntemi Bunu önlemek gerekir.
Steven

Yanıtlar:


156
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

Sahtekarların etrafına parantez koymayı deneyin. bu bağlantıya bakın


8
Stackoverflow'u çok seviyorum - teşekkürler Will, pastırmamı kurtardın
Peter Nixey

Teşekkürler, bu sorunumu çözdü!
Portakallar13

5
Neden neden neden? Burada neler oluyor?
jordanpg


10
Ne yazık ki bu her zaman işe yaramıyor. Bu temelde yeni bir rastgele sahte nesne alır, ancak RNG nedeniyle bunun başarısız olma şansı hala vardır.
Michael Lynch

46

Faker, mevcut sınırlı miktarda sahte veri nedeniyle hala yinelenen veriler sağlıyor olabilir.

Basit test amaçları ve benzersizlik doğrulamalarına ulaşmak için aşağıdakileri kullandım:

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

3
Bu cevap daha fazla oyu hak ediyor. Testiniz çok sayıda örnek oluşturduğunda gerçekleşmesi muhtemeldir.
Enrico Carlesso

Evet, Enrico'ya katılıyorum. +1
karlingen

Güzel fikir, ancak e-postaları oluşturmak için adınızı ve soyadınızı kullanırsanız veya formatta doğrulamalarınız varsa (parantez içeren herhangi bir ad bilmiyorsanız: P) parantez eklemek geri kalanını bozabilir.
Cyril DUCHON-Doris

18

Doğru cevabı korumak uğruna, burada blogdan taşınıyor, cevabın hakkını vermiyorum.

Aşağıdaki kodu kullanırsanız, faker benzersiz isimleri dağıtmayacaktır.

Factory.define :user do |u|
  u.first_name Faker::Name.first_name
  u.last_name Faker::Name.last_name
end

Ancak faker'in etrafına kaşlı ayraç koymak işe yarıyor!

Factory.define :user do |u|
  u.first_name { Faker::Name.first_name }
  u.last_name { Faker::Name.last_name }
end

Nedenini açıklamak için, ilk örnek aynı isimleri üretiyor. Sadece bir kez değerlendiriliyor. İkinci örnek, fabrika her kullanıldığında değerlendirilir.

Bunun nedeni, {}tembel değerlendirme sağlanmasıdır. Esasen, dönüş değeri olarak Faker çağrısıyla bir proc / lambda sağlıyorlar.


Bunu gönderdiğiniz için teşekkürler. Faker'in neden rastgele veri üretemediğini anlayamadım ve karşılaştığım her örnek, bana tuhaf gelen sıralamayı nasıl kullanacağımı gösterdi. Faker'i kullanmak istedim, böylece her kayıt sıralı değil rastgele. Faker aramalarımın etrafına parantez eklemek sorunu çözdü. Basit ve zarif!
Blimey85

5

Bir öznitelik üzerinde benzersizlik doğrulaması yaptığınızda dizileri kullanmanın (daha az verimli) bir alternatifi, önerilen bir değerin zaten var olup olmadığını kontrol etmek ve benzersiz olana kadar yenilerini denemeye devam etmektir:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.