2009-08-03 6 views
14

कहें कि मेरे पास User.rb में निम्न कोड वाला उपयोगकर्ता मॉडल है:फिक्स्चर मॉडल कॉलबैक ट्रिगर करते हैं?

before_create :create_dependencies 
after_create :build_inbox 

और मेरे पास इसमें उपयोगकर्ता फिक्स्चर के समूह के साथ एक उपयोगकर्ता.आईएमएल फ़ाइल भी है।

जब मैं रेक डीबी चलाता हूं: फिक्स्चर: लोड, यह कॉलबैक ट्रिगर करने के लिए प्रतीत नहीं होता है।

  1. क्या यह काम करने की उम्मीद है? यदि हां, तो उन्होंने इसे इस तरह क्यों डिजाइन किया?
  2. क्या फिक्स्चर लोड करते समय कॉलबैक की ट्रिगरिंग को मजबूर करने का कोई तरीका है?

उत्तर

20

क्या यह काम करने की उम्मीद है? यदि तो, उन्होंने इसे इस तरह क्यों डिजाइन किया?

हाँ, जुड़नार कॉलबैक का उपयोग नहीं करते। मुझे लगता है कि यह प्रदर्शन कारणों से है। मॉडल को तुरंत चालू किए बिना सीधे डाटाबेस में डेटा लोड करना तेज़ है।

वहाँ कॉलबैक के ट्रिगर मजबूर करने के लिए एक तरह से जब जुड़नार लोड हो रहा है?

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

दूसरा समाधान (और अत्यधिक अनुशंसित!) कारखानों का उपयोग करना है। कारखाने कॉलबैक ट्रिगर करते हैं और आपको आभासी विशेषताओं का उपयोग करने की इजाजत देते हैं, ऐसा इसलिए होता है क्योंकि वे हर बार मॉडल को तत्काल करते हैं। एक लोकप्रिय मणि Factory Girl है। कोशिश करने के लिए एक और Machinist है। मैंने विषय पर Railscasts episode भी बनाया है।

+0

बिल्कुल सही, धन्यवाद। कारखाने की लड़की को – cakeforcerberus

+0

+1। इसे दो महीने पहले बंद कर दिया, और मैंने कभी पीछे नहीं देखा। –

+0

+1 क्योंकि फैक्टरी गर्ल इतनी आश्चर्यजनक है ... इसे सीखने के लिए समय ले लो, आप अपने खोए हुए समय के लिए बहुत जल्दी तैयार रहेंगे। – Emerson

4

मुझे यह समस्या भी है। हमारा ऐप कुछ totals पहले_save की गणना करता है, इसलिए इसे फ्लाई पर नहीं किया जाना चाहिए। कुछ रिपोर्टों पर तेजी से रिपोर्टिंग करता है और कुछ जोड़ों में कटौती करता है।

उन वस्तुओं हम स्वयं इस तरह कॉलबैक चलाने के लिए परीक्षण में:

before do 
    order.perform_callbacks 
end 

यह अच्छी तरह से बाहर काम करता है, क्योंकि यह हर समय नहीं चलता है तो अन्य परीक्षण ग्रस्त नहीं है।

हम minitest और fixtures btw का उपयोग कर रहे हैं।

+0

यह कोड कहां रहता है? स्थिरता का शीर्ष? आदेश क्या है? – hellion

+0

हाय नरक। कोड पहले से ही मेरी टेस्ट फाइल के शीर्ष पर रहता है क्योंकि इस मामले में मुझे इस फ़ाइल में प्रत्येक टेस्ट के लिए इसकी आवश्यकता है। यदि आपको केवल 1 टेस्ट के लिए कॉलबैक चलाने की आवश्यकता है तो आप केवल उस विशेष परीक्षण में .perform_callbacks डाल सकते हैं। – jacklin

+0

'ऑर्डर', एक वर्ग, एक उदाहरण क्या है? यह अजीब बात है कि मुझे कहीं भी 'perform_callbacks' दस्तावेज नहीं मिल रहा है। –