2012-09-21 8 views
5

मेरे पास एक सहायक है जो request.fullpath तक पहुंचता है। एक पृथक सहायक परीक्षण के भीतर, request उपलब्ध नहीं है। मुझे क्या करना चाहिए? क्या मैं इसे किसी तरह या नकली कर सकता हूं?रेल: एक सहायक का परीक्षण करें जिसे रेल पर्यावरण तक पहुंच की आवश्यकता है (उदा। Request.fullpath)

मैं रेल और आरएसपीसी के नवीनतम संस्करणों का उपयोग कर रहा हूं।

def item(*args, &block) 
    # some code 

    if request.fullpath == 'some-path' 
    # do some stuff 
    end 
end 

तो समस्याग्रस्त कोड लाइन # 4 जहां सहायक request वस्तु जो सहायक कल्पना में उपलब्ध नहीं है के उपयोग की जरूरत है: यहाँ क्या मेरी सहायक लग रहा है की तरह है।

धन्यवाद मदद के लिए बहुत कुछ।

+0

आप "की आवश्यकता होती है 'rspec/रेल'" है अपने spec_helper.rb में: जैसे जैसे इतना

request = mock('request').as_null_object 

यह सब तो आप शायद अपने विशिष्ट परीक्षण गुजर प्राप्त करने की आवश्यकता की तरह लग रहा है? – Rubyman

+0

हाँ, मैं करता हूं। धन्यवाद। –

उत्तर

4

हाँ, आप अनुरोध नकली कर सकते हैं। मेरे यहां एक लंबा लंबा जवाब था कि यह कैसे करना है, लेकिन वास्तव में यह आवश्यक नहीं है कि आप क्या चाहते हैं।

बस अपने उदाहरण में सहायक वस्तु पर अपनी सहायक विधि को कॉल करें। इस प्रकार:

describe "#item" do 
    it "does whatever" do 
    helper.item.should ... 
    end 
end 

इससे आपको एक परीक्षण अनुरोध ऑब्जेक्ट तक पहुंच मिल जाएगी। पर निर्भर करता है के बाद से

before :each do 
    helper.request.path = 'some-path' 
end 

वास्तव में, पूर्णता के लिए, मुझे मेरी मूल जवाब शामिल कर सकते हैं, आप क्या प्रयास कर रहे हैं: आप अनुरोध पथ के लिए एक विशिष्ट मूल्य निर्दिष्ट करने की आवश्यकता है, तो आप इस तरह ऐसा कर सकते हैं ऐसा करने के लिए अभी भी सहायक हो सकता है। सभी एक पंक्ति में & ठूंठ उपहास करने के लिए

request = mock('request') 
controller.stub(:request).and_return request 

आप लौटे अनुरोध इसी तरह

request.stub(:method).and_return return_value 

और विकल्प वाक्य रचना के ठूंठ विधियां जोड़ सकते हैं:

का तरीका यहां बताया अनुरोध नकली कर सकते हैं

request = mock('request', :method => return_value) 

रुपेक शिकायत करेगा अगर आपके नकली को मैसा प्राप्त होता है जीएस कि आप stub नहीं था। यदि अन्य सामान हैं तो सहायक ऑब्जेक्ट पर बस अपने अनुरोध सहायक विधि को कॉल करें, यह कर रहा है कि आपको अपने परीक्षण में परवाह नहीं है, आप नकली को "शून्य वस्तु" बनाकर आरएसपीसी को बंद कर सकते हैं, उदाहरण के लिए।

describe "#item" do 
    let(:request){ mock('request', :fullpath => 'some-path') } 

    before :each do 
    controller.stub(:request).and_return request 
    end 

    it "does whatever" 
end 
+0

मेरे पिछले जवाब को अनदेखा करें। इसने वर्णन किया कि अनुरोध ऑब्जेक्ट का नकल कैसे करें, लेकिन यह एक जरूरी नहीं है कि आप एक सहायक नमूना में जो चाहते हैं उसे प्राप्त करने का सही तरीका है। ऊपर देखो। – gregates

+0

बहुत बहुत धन्यवाद, यह एक आकर्षण की तरह काम करता है। फिर भी, मैं थोड़ा अनिश्चित हूं, ऐसा क्यों करता है। क्या 'helper.my_method' पर सीधी कॉल सरल' my_method' कॉल की तरह नहीं है? मददगारों का परीक्षण करते समय, क्या मुझे हमेशा उन्हें 'सहायक' ऑब्जेक्ट पर कॉल करना चाहिए?नियंत्रकों और विचार परीक्षणों के लिए एक समान वस्तु है? –

+1

वहाँ है! अज्ञात नियंत्रकों के साथ आप बहुत सारी रोचक सामग्री कर सकते हैं; rspec-rails आपको एक नियंत्रक 'ऑब्जेक्ट देता है जो एप्लिकेशन नियंत्रक से प्राप्त होता है, और आप पहले_फिल्टर या अन्य किसी भी परीक्षण के परीक्षण के लिए उस पर स्टब क्रियाएं परिभाषित कर सकते हैं। ईमानदारी से मुझे यकीन नहीं है कि मैं काफी समझदार हूं कि आपको यह समझाने के लिए पर्याप्त क्यों है कि आपको 'हेल्पर' ऑब्जेक्ट पर अपनी विधि क्यों कॉल करने की आवश्यकता है। यदि आप और जानना चाहते हैं तो मैं https://www.relishapp.com/rspec/rspec-rails/v/2-11 पर rspec दस्तावेज़ों का अध्ययन करने की अनुशंसा करता हूं। – gregates

0

एक सहायक कल्पना में, आप controller.request का उपयोग कर अनुरोध का उपयोग कर सकते हैं (ताकि controller.request.stub(:fullpath) { "whatever" } काम करना चाहिए)

+0

धन्यवाद, लेकिन ऐसा लगता है कि यह 'अनुरोध' वस्तु सहायक में उपलब्ध नहीं है (जो समस्या है)। –