2012-08-01 7 views
8

मैं अपने फैक्टरीगर्ल कारखानों में से किसी एक में उपयोग के लिए एक सामान्य विधि कैसे परिभाषित कर सकता हूं? उदाहरण के लिए:मैं फैक्टरीगर्ल फैक्ट्री पर एक विधि कैसे परिभाषित कर सकता हूं?

FactoryGirl.define do 
    def silly_horse_name 
    verbs = %w[brunches dribbles haggles meddles] 
    nouns = %w[landmines hamlets vandals piglets] 
    "#{verbs.sample} with #{nouns.sample}".titleize 
    end 

    factory :racehorse do 
    name { silly_horse_name } # eg, "Brunches with Landmines" 

    after_build do |horse, evaluator| 
     puts "oh boy, I built #{silly_horse_name}!" 
    end 

    end 
end 

यह इस तरह से सब पर silly_horse_name फोन नहीं करता है करना; अगर इसे raise 'hey!' पर फिर से परिभाषित किया गया है, तो कुछ भी नहीं होता है।

मैं फैक्टरीगर्ल 2.5.2 का उपयोग कर रहा हूं।

उत्तर

1

मेरा सुझाव main पर उस विधि को परिभाषित करना होगा। तो बस इसे FactoryGirl.define ब्लॉक के बाहर अपनी फ़ाइल के शीर्ष पर ले जाएं।

+0

यह काम करता है। यह वैश्विक नामस्थान में जा रहा है, लेकिन यह केवल परीक्षण पर्यावरण में परिभाषित है, और यदि नाम पर्याप्त अद्वितीय है, तो इससे कोई फर्क नहीं पड़ता। –

+1

मुझे यह समाधान बिल्कुल पसंद नहीं है, लेकिन कोशिश की और एक और समाधान नहीं मिला। मुझे इसके बारे में सबसे ज्यादा भ्रमित करने वाला यह है कि [एफजी दस्तावेज] (https://github.com/thoughtbot/factory_girl/blob/master/GETTING_STARTED.md#callbacks) का अर्थ यह है कि इस उदाहरण का उपयोग करके यह संभव है: 'after (: build) {| उपयोगकर्ता | do_something_to (उपयोगकर्ता)} ' –

4

सबसे अच्छा समाधान जो मुझे मिल सकता है वह वैश्विक नामस्थान को प्रदूषित नहीं करता था, इसे मॉड्यूल में परिभाषित करना था। ,

# /spec/factory_helpers.rb: 

module FactoryHelpers 
    extend self 

    def silly_penguin_name # who says penguins can't be silly too?! 
    ... 
    end 
end 

# /spec/factories.rb: 

require 'factory_helpers' 

FactoryGirl.define do 

    factory :racepenguin do 
    name { FactoryHelpers.silly_penguin_name } 
    end 

end 

वैसे: उदाहरण के लिए,

module FactoryHelpers 
    extend self 

    def silly_horse_name 
    ... 
    end 
end 

FactoryGirl.define do 
    factory :racehorse do 
    name { silly_horse_name } 
    end 
end 

Source

+4

क्या आपको फैक्ट्री में 'फैक्टरीहेल्पर' मॉड्यूल को किसी भी तरह शामिल करना है? उपर्युक्त का उपयोग करके, मैं # अनिश्चित विधि silly_horse_name # ' – robd

1

ठीक है, यहाँ मेरी दो सेंट है (कृपया ध्यान दें कि स्टीव जवाब देने के लिए सूक्ष्म अंतर हैं कि) मैं फैक्टरीगर्ल संस्करण 4.8.0 और रेल संस्करण 4.2.0 पर हूं।