Faker डुप्लिकेट डेटा का उत्पादन कर रहा है जब factory_girl में उपयोग किया जाता है


86

मैं 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: "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">

मैं प्रत्येक उपयोगकर्ता के लिए नए नाम उत्पन्न करने के लिए फ़ेकर रत्न कैसे प्राप्त कर सकता हूं और न केवल मूल का पुन: उपयोग कर सकता हूं?


1
बस अंधेरे में एक शॉट, लेकिन क्या आपने कुछ का उपयोग करने की कोशिश की है user.sequence(:first_name} {|n| Faker::Name::first_name}? जब यह आपके "जुड़नार" को लोड करता है तो FactoryGirl संभवतः आपके Faker कॉल का मूल्यांकन कर रहा है। sequence param,&blockविधि का उपयोग करते हुए उस को रोकना चाहिए।
स्टीवन

जवाबों:


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

कोष्ठक के चारों ओर कोष्ठक लगाने का प्रयास करें। इस लिंक को देखें



धन्यवाद, यह मेरा मुद्दा तय!
13:13 पर Oranges13

5
क्यों क्यों क्यों? यहाँ क्या हो रहा है?
jordanpg

4
"आलसी विशेषता" के कारण, देखें: github.com/thoughtbot/factory_girl/blob/master/…
Siwei शेन

9
अफसोस की बात है कि यह हमेशा काम नहीं करता है। यह मूल रूप से सिर्फ एक नया यादृच्छिक फ़ेकर वस्तु प्राप्त करता है, हालांकि आरएनजी की वजह से, अभी भी एक मौका है यह विफल रहता है।
माइकल लिंच

45

ध्यान दें कि नकली डेटा की सीमित मात्रा के कारण Faker अभी भी डुप्लिकेट डेटा प्रदान कर सकता है।

सरल परीक्षण प्रयोजनों के लिए और विशिष्टता मान्यताओं द्वारा प्राप्त करने के लिए, मैंने निम्नलिखित का उपयोग किया है:

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

3
यह उत्तर अधिक उत्थान के योग्य है। यह तब होने की संभावना है जब आपका परीक्षण बहुत सारे उदाहरण बनाता है।
एनरिको कारलेसो

हाँ, मैं एनरिको से सहमत हूँ। +1
करलिंगन

अच्छा विचार है, लेकिन यदि आप ईमेल बनाने के लिए प्रथम नाम और अंतिम नाम का उपयोग करते हैं, या आप फॉर्मेट पर सत्यापन करते हैं (किसी भी नाम का पता नहीं है जिसमें कोष्ठक: पी) है, तो कोष्ठक जोड़ना बाकी को तोड़ सकता है।
सिरिल डचोन-डोरिस

18

सही उत्तर के संरक्षण के लिए, यह ब्लॉग से अनुवादित है, मैं उत्तर के लिए कोई श्रेय नहीं लेता।

यदि आप नीचे दिए गए कोड का उपयोग करते हैं, तो faker अद्वितीय नामों को मंथन नहीं करेगा

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

हालांकि faker के चारों ओर घुंघराले ब्रेसिज़ लगाने से यह काम करता है!

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

यह समझाने के लिए कि, पहला उदाहरण समान नामों का उत्पादन क्यों कर रहा है। यह केवल एक बार मूल्यांकन कर रहा है। हर बार कारखाने का उपयोग करने के बाद दूसरा उदाहरण मूल्यांकन करता है।

यह {}आलसी मूल्यांकन प्रदान करने के कारण है । अनिवार्य रूप से वे एफएआर कॉल के साथ एक वापसी / लैम्ब्डा प्रदान कर रहे हैं जो उनके वापसी मूल्य के रूप में है।


इसे पोस्ट करने के लिए आपका धन्यवाद। मैं यह पता नहीं लगा सका कि फ़ेकर यादृच्छिक डेटा क्यों नहीं बना पा रहा था और ऐसा लग रहा था कि मुझे हर उदाहरण ऐसा प्रतीत हो रहा है कि अनुक्रमण का उपयोग कैसे किया जाए जो मुझे अजीब लगा। मैं Faker का उपयोग करना चाहता था, इसलिए प्रत्येक रिकॉर्ड यादृच्छिक है, अनुक्रम नहीं। बस मेरे Faker कॉल के आसपास ब्रेसिज़ जोड़ने से समस्या हल हो गई। सरल और सुरुचिपूर्ण!
ब्लीमी 85

5

जब आप किसी विशेषता पर अद्वितीयता मान्यता रखते हैं, तो अनुक्रमों का उपयोग करने के लिए एक (कम कुशल) विकल्प एक प्रस्तावित मूल्य पहले से मौजूद है या नहीं और जब तक यह अद्वितीय नहीं है, तब तक नए प्रयास करते रहें।

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.