2011-03-09 18 views
12

के साथ must_receive या stub_chain का उपयोग करना मैं रेल 3.0.4 और आरएसपीसी 2.5 का उपयोग करता हूं। मेरी नियंत्रकों में मैं स्कोप भारी नामित उपयोग करते हैं, उदाहरण के लिएरेल 3, आरएसपीसी 2.5: नामित स्कॉप्स

 
    @collection = GuestbookEntry.nonreplies.bydate.inclusive.paginate(
     :page => params[:page], :conditions => { ... }) 

मेरे परीक्षण में, मैं इस तरह के एक प्रश्न, नहीं शब्दों की परिणाम उपहास करने के लिए सक्षम होना चाहते हैं। मुझे नहीं लगता कि यह समझ में आता है की तरह

 
    GuestbookEntry.stub_chain(:nonreplies, :bydate, ...).and_return(...) 

कुछ करने के लिए है, क्योंकि इस परीक्षण पल मैं नामित स्कोप को पुन: व्यवस्थित करने का फैसला असफल हो जायेगी है।

रेल 2.3 और RSpec 1.x के साथ, इस ठीक काम किया: मैं

 
    GuestbookEntry.should_receive(:find).with(:all, :conditions => { ... }) 

लिख सकता है और इसके बाद के संस्करण कॉल पकड़ा जाएगा और सही ढंग से संभाला। हालांकि, रेल 3 के साथ, किसी कारण से यह अब और काम नहीं करता है।

क्यों? मैं नेस्टेड स्कॉप्स के परिणाम पर अपेक्षाओं या स्टब्स कैसे सेट करूं? चूंकि रेल 3 के एक्टिवमोडेल में सबकुछ एक नामित गुंजाइश है (एआरएल के लिए धन्यवाद), यह किसी भी तरह से संभव होना चाहिए, या परीक्षण वास्तव में बहुत भंगुर होंगे।

धन्यवाद!

अद्यतन:issue report on GitHub भी देखें।

उत्तर

1

इस समस्या ने मुझे थोड़ी देर के लिए भी खराब कर दिया है!

मुझे विश्वास है कि व्यवहार रेल 2 से अलग है क्योंकि क्वेरी अब नियंत्रक में परिवर्तनीय असाइनमेंट के दौरान नहीं की जा रही है। इसके बजाए, यह आवश्यकतानुसार आलसी भरा हुआ है।

मैं मार्क वाइल्डन से सहमत हूं कि इन सभी क्षेत्रों को एक बड़े दायरे में लपेटना बेहतर है और आपके मॉडल में यह कल्पना करना बेहतर है। इस दायरे में स्पष्ट रूप से एक विशिष्ट कार्य होता है, इसलिए जैसे कोई एक विधि के व्यवहार को कल्पना करता है जो कई अन्य तरीकों को बुलाता है, आप एक ऐसे दायरे के व्यवहार को कल्पना करेंगे जो कई अन्य क्षेत्रों में शामिल हो।

0

मैं इस तरह की एक जटिल क्वेरी को अपने दायरे में लपेटूंगा, और उसे दबा दूंगा।

+0

फिर मैं चश्मा कैसे लिखूं जो यह सत्यापित करता है कि एक गुंजाइश वह करता है जो इसे करना है? मेरा विचार एकाधिक _simple_ scopes लिखना था जो _obvious_ हैं ताकि उनके अंदर लगभग कुछ भी "गलत हो" जा सके, और फिर उन्हें गठबंधन कर सकें, क्योंकि स्कोप स्पीप्स के लिए इतना कठिन है (वास्तविक डेटा के साथ वास्तविक डेटाबेस को पॉपुलटिंग और क्वेरी करने के बिना)। – Jens

+0

मुझे लगता है कि आपको प्रत्येक "पूर्ण दायरा" का नमूना देना होगा, अन्यथा आप नहीं जान पाएंगे कि आपने उन्हें सही तरीके से संयोजित किया है। यहां तक ​​कि यदि आप कल्पना करते हैं कि सही संयोजन किया गया था, तो आपको यह दिखाने के लिए एक समग्र कल्पना की आवश्यकता है कि समस्या स्वयं को हल करने का सही तरीका था। लेकिन यदि आप अपने दायरे में जटिल गुंजाइश डालते हैं, तो आपको कम से कम "शब्द" के आदेश के बारे में चिंता करने की ज़रूरत नहीं है क्योंकि यह केवल एक ही स्थान पर किया जाता है। मुझे नहीं लगता कि आप डेटाबेस को पॉप्युलेट करने से दूर हो सकते हैं। व्यक्तिगत रूप से, मुझे मॉडल विधियों को नकल करने के बजाय वास्तविक डेटा सेट अप करने के लिए कारखानों का उपयोग करना आसान (और "सुरक्षित") लगता है। –

संबंधित मुद्दे