2011-06-26 12 views
25

के साथ नामित स्कॉप्स का परीक्षण मैं रेल वेब अनुप्रयोगों और आरएसपीईसी का परीक्षण करने के लिए नया हूं। मैं विरासत कोड के साथ काम करता हूं और परीक्षण जोड़ने की आवश्यकता है। तो आरएसपीईसी के साथ खोजकर्ताओं और नामित क्षेत्रों का परीक्षण करने का सबसे अच्छा तरीका क्या है?रेल: आरएसपीसी

मुझे Google में कुछ दृष्टिकोण मिलते हैं लेकिन वे आदर्श नहीं हैं। उदाहरण के लिए:

http://paulsturgess.co.uk/articles/show/93-using-rspec-to-test-a-named_scope-in-ruby-on-rails

it "excludes users that are not active" do 
    @user = Factory(:user, :active => false) 
    User.active.should_not include(@user) 
end 

या

http://h1labs.com/notebook/2008/8/21/testing-named-scope-with-rspec

it "should have a published named scope that returns ..." do 
    Post.published.proxy_options.should == {:conditions => {:published => true}} 
end 

मैं सबसे अच्छा तरीका (IMHO) लगता है "रेल टेस्ट नुस्खे" में:

should_match_find_method :active_only { :active == true } 

जहां should_match_find_method कस्टम सहायक विधि

+2

स्कोप परीक्षण वास्तव में अनुभवजन्य हैं और मैं आपके द्वारा यहां दिखाई देने वाली पहली विधि के साथ चिपकता हूं – apneadiving

+4

मैं सहमत हूं। पहले दृष्टिकोण के साथ क्या गलत है? यह संभवतः त्रुटिपूर्ण विन्यास पैरामीटर की जांच (वास्तव में केवल पुनर्लेखन) की बजाय वास्तविक व्यवहार को चश्मा देता है। –

+0

@RobDavis "संभावित रूप से त्रुटिपूर्ण विन्यास पैरामीटर" +1 –

उत्तर

29

आरएसपीसी के निर्माता ने हाल ही में ब्लॉग किया है कि वह Validations are behavior, associations are structure सोचता है। दूसरे शब्दों में वह पाते हैं कि एसोसिएशन (और स्कॉप्स) को सीधे परीक्षण नहीं किया जाना चाहिए। इनके लिए टेस्ट आपके इच्छित व्यवहार से पालन करेंगे।

दूसरे शब्दों में, वर्तमान ज्ञान यह है कि प्रत्येक स्कोप का परीक्षण करने की कोई आवश्यकता नहीं है, क्योंकि आप इन अनुप्रयोगों को अपने आवेदन के व्यवहार का परीक्षण करके कवर करेंगे।

+32

वह उस पद में स्कॉप्स के बारे में कुछ भी नहीं बताता है, फिर भी, आप उन्हें संघों के साथ क्यों जोड़ते हैं? स्कॉप्स संघों की तुलना में कहीं अधिक जटिल और त्रुटि प्रवण हो सकते हैं, और मुझे विश्वास है कि परीक्षण किया जाना चाहिए। चूंकि आपने शक्तिशाली निर्माता को आमंत्रित किया है, [यहां] (http://groups.google.com/group/rspec/browse_thread/thread/6706c3f2cceef97f) वह सुझाव देता है कि यदि व्यवहार का छतरी के नीचे एक गुंजाइश आती है (और यदि यह नहीं है , यह वहाँ क्यों है?), तो यह निर्दिष्ट किया जाना चाहिए। –

+3

मैं इस बात से असहमत नहीं हूं कि स्कॉप्स का परीक्षण नहीं किया जाना चाहिए। वे निश्चित रूप से चाहिए। बस सीधे नहीं; स्कोप का परीक्षण ऐप के व्यवहार का परीक्षण करके संचालित किया जाना चाहिए।मैं स्कोप्स को एसोसिएशन के समान दिखता हूं, क्योंकि दोनों में जटिल विकल्प हो सकते हैं जैसे कि जॉइन, मॉडल शामिल हैं, जहां/समूह द्वारा/इत्यादि। किसी भी मामले में, यह मुझे समझ में आता है। –

0

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

+2

क्या आप वाकई मॉडल स्पेक में अनावश्यक पूछताछ कर रहे हैं? मैं समझ सकता हूं कि इसे नियंत्रक में नहीं कर रहा है या spec - mock को देखकर इसे दूर कर सकता हूं। लेकिन मुझे लगता है कि आप मॉडल और उसके डेटाबेस से इसके संबंधों का परीक्षण करना चाहते हैं। – jaydel

+0

आईएमओ नामांकित स्कॉप्स का परीक्षण करते समय अनावश्यक है। आपके पास वास्तव में डेटाबेस से पढ़ने वाले कई अन्य परीक्षण होना चाहिए। –

+14

स्कॉप्स एक ऐसा क्षेत्र है जहां वास्तविक वस्तुओं को लाने के लिए डेटाबेस से पूछताछ करना निश्चित रूप से समझ में आता है। मैं मजाक कर रहा हूं जहां यह उचित है, लेकिन केवल सबसे सरल स्कॉप्स मॉक्स के साथ काम करेंगे। एक बार जब आप जुड़ना या समूह करना शुरू कर देते हैं, तो वे टूट जाएंगे, और मैंने इसे वास्तविक बैकिंग स्टोर के विरुद्ध स्कॉप्स का परीक्षण करने का नियम बना दिया है। दूसरे और तीसरे उदाहरणों जैसे कॉन्फ़िगरेशन-आधारित मैचर्स त्रुटि-प्रवण, IMHO हैं। यही है, वे आपके कोड के समान त्रुटियों की संभावना है। –

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