FactoryGirl में निर्माण और बनाने के तरीकों में क्या अंतर है?


94

फैक्टरी लड़की शुरूआत के बीच अंतर की रूपरेखा FactoryGirl.build()और FactoryGirl.create():

# Returns a User instance that's not saved
user = FactoryGirl.build(:user)

# Returns a saved User instance
user = FactoryGirl.create(:user)

मैं अभी भी दोनों के बीच के व्यावहारिक अंतर को नहीं समझता। क्या कोई उदाहरण दे सकता है कि आप एक का उपयोग करना चाहते हैं और दूसरे का नहीं? धन्यवाद!

जवाबों:


116

create()विधि मॉडल के उदाहरण बनी रहती है, जबकि build()विधि यह केवल स्मृति रहती है।

व्यक्तिगत रूप से, मैं create()केवल तभी विधि का उपयोग करता हूं जब दृढ़ता से लिखना आवश्यक होता है क्योंकि डीबी को लिखने से परीक्षण समय लगता है।

जैसे

मैं उपयोगकर्ताओं को प्रमाणीकरण के लिए बनाता हूं create()क्योंकि मेरा प्रमाणीकरण इंजन DB पर सवाल उठाता है।

यह जांचने के लिए कि क्या मॉडल में एक विशेषता है, build()विधि करेगी क्योंकि कोई डीबी एक्सेस की आवश्यकता नहीं है।

it{Factory.build(:user).should respond_to(:name)}

अपडेट करें

"एक अपवाद है जो वास्तव में 'क्रिएशन' का निर्माण करता है, जब आप संघों का निर्माण कर रहे होते हैं, अर्थात आपकी संगति स्मृति में नहीं रह जाती है, लेकिन बनी रहती है। इसे ध्यान में रखें" - हिलाता है।


14
एक अपवाद है कि जब आप संघों का निर्माण कर रहे होते हैं तो वास्तव में 'क्रिएट' करते हैं, यानी आपका जुड़ाव स्मृति में नहीं रह जाता है, बल्कि बना रहता है। ध्यान रखें कि
हिलाता है

@ शेक्स, मैं अब रेल में काम नहीं करता। मैं जल्द से जल्द जाँच करूँगा।
हेलियो सैंटोस

किसी की प्रत्येक आवृत्ति को बदलने के लिए एक उपकरण बना दिया है createके साथ buildहै, और इसे पूर्ववत करता है, तो परीक्षण में विफल रहता है?
mg33

क्या #createपढ़ सकते हैं और डिस्क से मौजूदा वस्तु लौटने, या इसे बने के बाद उद्देश्य यह है कि के लौटने करता स्मृति में? दूसरे शब्दों में, क्या इसके create(...)समकक्ष है create(...).reload?
डेनिस

@mgold विम उस तरह की चीज़ पर बहुत अच्छा है।
सीमित प्रायश्चित

15

उपयोग करना FactoryGirl.build(:factory_name)db के लिए नहीं रहता है और कॉल नहीं करता है save!, इसलिए आपका सक्रिय रिकॉर्ड सत्यापन नहीं चलेगा। यह बहुत तेज़ है, लेकिन सत्यापन महत्वपूर्ण हो सकता है।

उपयोग FactoryGirl.create(:factory_name)db के लिए जारी रहेगा और सक्रिय रिकॉर्ड सत्यापन को कॉल करेगा। यह स्पष्ट रूप से धीमा है, लेकिन सत्यापन त्रुटियों को पकड़ सकता है (यदि आप अपने परीक्षणों में उनकी परवाह करते हैं)।


11
या, आप बस FactoryGirl.build (: factory_name) कर सकते हैं। जो डेटाबेस को सहेजे बिना सत्यापन चलाते हैं।
jinavar1

1

FactoryGirl.create()इसके लिए नई वस्तु और संघों (यदि कारखाना कोई है) बनाएंगे। वे सभी एक डेटाबेस में बने रहेंगे। साथ ही, यह मॉडल और डेटाबेस सत्यापन दोनों को ट्रिगर करेगा। फ़ैक्टरी सहेजे जाने के बाद कॉलबैक after(:build)और after(:create)कॉल किया जाएगा। इसके अलावा before(:create)पहले कारखाने सहेजा जाता है बुलाया जाएगा।

FactoryGirl.build()एक ऑब्जेक्ट नहीं बचा है, लेकिन अभी भी एक डेटाबेस के लिए अनुरोध करेंगे अगर कारखाना संघों है। यह केवल संबद्ध वस्तुओं के लिए मान्यताओं को ट्रिगर करेगा। after(:build)फैक्ट्री बनने के बाद कॉलबैक कहा जाएगा।

ध्यान दें कि ज्यादातर मामलों में जब परीक्षण मॉडल build_stubbedबेहतर प्रदर्शन के लिए उपयोग करने के लिए सबसे अच्छा होता है । इसके बारे में यहाँ और पढ़ें ।

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