मैं एक ही काम करने में दिलचस्पी रखता था, मेरा एक मॉडल का परीक्षण करने के लिए जो एक 3-पार्टी एपीआई से सामग्री के हैश का उपयोग करके संचालित होता है। मैंने पाया कि factory_girl की कुछ अंतर्निहित सुविधाओं का उपयोग करके मैं इन प्रकार की डेटा संरचनाओं का निर्माण करने में सक्षम था।
यहाँ एक उदाहरण दिया गया है:
factory :chicken, class:Hash do
name "Sebastian"
colors ["white", "orange"]
favorites {{
"PETC" => "http://www.petc.org"
}}
initialize_with { attributes }
end
यहाँ मुख्य चाल यह है कि जब आप initialize_with घोषित करते हैं, तो factory_girl परिणामी ऑब्जेक्ट को विशेषताएँ असाइन करने का प्रयास नहीं करेगा। यह भी इस मामले में db स्टोर को छोड़ देता है। इसलिए, हम कुछ भी जटिल बनाने के बजाय, अपनी सामग्री के रूप में पहले से तैयार विशेषता हैश को वापस कर देते हैं। वोइला।
वर्ग के लिए कुछ मूल्य निर्दिष्ट करना आवश्यक प्रतीत होता है, इसके बावजूद कि वास्तव में इसका उपयोग नहीं किया जा रहा है। यह फैक्ट्री_गर्ल को फैक्ट्री के नाम पर आधारित एक क्लास को इंस्टेंट करने की कोशिश से रोकने के लिए है। मैंने ऑब्जेक्ट के बजाय वर्णनात्मक कक्षाओं का उपयोग करने के लिए चुना है, लेकिन यह आपके ऊपर है।
जब आप इनमें से एक हैश कारखानों का उपयोग करते हैं, तब भी आप फ़ील्ड को ओवरराइड करने में सक्षम होते हैं:
chick = FactoryGirl.build(:chicken, name:"Charles")
.. जब भी, आपके पास नेस्टेड सामग्री है और गहरे क्षेत्रों को ओवरराइड करना चाहते हैं, तो आपको किसी प्रकार के गहरे मर्ज को करने के लिए इनिशियलाइज़ेशन ब्लॉक की जटिलता को बढ़ाना होगा।
आपके मामले में, आप कुछ मिश्रित सरणी और हैश डेटा का उपयोग कर रहे हैं, और ऐसा प्रतीत होता है कि पथ संरचना को डेटा संरचना के कुछ हिस्सों के बीच पुन: उपयोग किया जाना चाहिए। कोई समस्या नहीं है - आप सामग्री की संरचना को जानते हैं, इसलिए आप एक कारखाना बना सकते हैं जो परिणामस्वरूप सरणी को ठीक से बनाता है। यहाँ है कि मैं यह कैसे कर सकता हूँ:
factory :dropbox_hash, class:Array do
path "/home"
revision 48
rev "30054214dc"
thumb_exists false
bytes 0
modified { 3.days.ago }
is_dir true
icon "folder_app"
root "app_folder"
size "0 bytes"
initialize_with { [ attributes[:path], attributes ] }
end
FactoryGirl.build(:dropbox_hash, path:"/Chickens", is_dir:false)
आप अभी भी अनावश्यक मूल्यों को छोड़ने के लिए स्वतंत्र हैं। आइए केवल कल्पना करें कि पथ और रेव वास्तव में आवश्यक हैं:
factory :dropbox_hash, class:Array do
path "/home"
rev "30054214dc"
initialize_with { [ attributes[:path], attributes ] }
end
FactoryGirl.build(:dropbox_hash, path:"/Chickens", revision:99, modified:Time.now)