2011-11-14 1 views
19

मान लें कि आपके पास एक शॉपिंग साइट है जो विजेट बेचती है। हालांकि, प्रत्येक विजेट की सूची सीमित है, इसलिए "widget.number_still_available" संख्या को अद्यतित रखना महत्वपूर्ण है।rspec के साथ परीक्षण करते समय, सामान्य "परीक्षण उपयोगिता विधियों" को कहां रखा जाए?

मैं

it "always displays the correct number still available" do 

    # Assume there is a before method that sets up a widget with 5 available 

    widget.number_still_available.should == 5 

    # User "[email protected]" purchases 2 widgets 
    widget.number_still_available.should == 3 

    # User "[email protected].com" purchases 1 widget 
    widget.number_still_available.shhould == 2 

    # User "[email protected]" cancels purchase of 1 widget 
    widget.number_still_available.should == 4 
end 

की तर्ज मैं परीक्षण केवल-तरीकों कि "क्रय" और "रद्द" तरीकों करता है लिखने में सक्षम होना चाहते हैं के साथ एक rspec परीक्षण लिखने के लिए करना चाहते हैं। ये क्रियाएं विभिन्न मॉडलों के लिए मेरे मॉडल में किसी भी "असली" विधियों के अनुरूप नहीं हैं (सबसे महत्वपूर्ण रूप से PHP में एक decoupled बैक-एंड सिस्टम है जो क्रय और रद्द करने के कार्यों का हिस्सा करती है)।

आरएसपीईसी का उपयोग करते समय इस कोड को रखने के लिए सही जगह कहां है? ककड़ी में, मैं कुछ कदम लिख सकता था - लेकिन मुझे यकीन नहीं है कि आरएसपीईसी के लिए सही समतुल्य क्या है।

उत्तर

40

मैं spec/supportpurchase_helpers.rb कहा जाता है में एक नई फ़ाइल करने का सुझाव देते हैं और यह में इस सामग्री डाल होगा:

module PurchaseHelpers 
    def purchase_widgets(user, count=1) 
    # Code goes here 
    end 

    def cancel_purchase(user, count=1) 
    # Code goes here 
    end 
end 

RSpec.configure do |c| 
    c.include PurchaseHelpers 
end 

बजाय spec/spec_helper.rb में यह कर यह चकिंग का लाभ यह है कि इसके साथ कि फ़ाइल को भीड़ नहीं है आरएसपीईसी कोड के बहुत से असंबद्ध-से-सेटअप। चीज़ों को अलग करना चीजों को करने का बेहतर तरीका है।

+1

ध्यान दें कि यह उसी फ़ाइल में बंदर पैच मॉडल कक्षाओं पर भी काम करता है। इसलिए, यदि आपने उपयोगकर्ता पर एक test-only विधि होने के लिए 'buy_widgets' को प्राथमिकता दी है, तो आप इस फ़ाइल में उपयोगकर्ता क्लास खोल सकते हैं और इसे जोड़ सकते हैं। इसके अलावा, अतिरिक्त सुविधा के लिए, यदि आप स्पार्क के साथ परीक्षण कर रहे हैं, तो आप spec_helper.rb में 'Spork.each_run' ब्लॉक के अंदर 'लोड" # {Rails.root} /spec/support/purchase_helpers.rb "' जोड़ना चाहेंगे। – cailinanne

+1

वह अंतिम बिट केवल तभी जरूरी है जब आप सभी चश्मा के नामस्थान में 'खरीद हेल्पर' विधियां शामिल करना चाहते हैं। यदि आप केवल तभी ऐसा करना चाहते हैं जब आप आवश्यक हों, तो आप अपने 'वर्णन' ब्लॉक में 'खरीद हेल्पर' शामिल कर सकते हैं। –

2

आप एक बंदरपैच spec_helper.rb में या सीधे spec फ़ाइल के शीर्ष पर छोड़ सकते हैं यदि यह केवल उस फ़ाइल के लिए उपयोग किया जाता है।

कक्षाओं के बंदरगाह की बजाय मौजूदा वर्ग विधियों का उपयोग करने वाले सहायक तरीके बनाने के लिए यह अधिक स्पष्ट और सुरक्षित होगा।