rspec

2012-12-02 12 views
7

में एक सहायक कल्पना से सत्र को एक्सेस करना मैं अपने ApplicationHelper में एक विधि होगा कि मेरे टोकरी में कोई आइटम नहीं हैrspec

module ApplicationHelper 
    def has_basket_items? 
    basket = Basket.find(session[:basket_id]) 
    basket ? !basket.basket_items.empty? : false 
    end 
end 

यहाँ मेरी सहायक कल्पना मैं इस परीक्षण करने के लिए है कि यह देखने के लिए जाँच करता है कि है:

require 'spec_helper' 

describe ApplicationHelper do 
    describe 'has_basket_items?' do 
    describe 'with no basket' do 

     it "should return false" do 
     helper.has_basket_items?.should be_false 
     end 

    end 
    end 
end 

लेकिन जब मैं परीक्षण चलाने मैं

SystemStackError: stack level too deep 
/home/user/.rvm/gems/ruby-1.9.3-p194/gems/actionpack-3.2.8/lib/action_dispatch/testing/test_process.rb:13: 

प्राप्त इस डिबगिंग से मैं देखता हूँ कि सत्र को एक्शनडिस्पेच :: test.srocess में @ request.session से एक्सेस किया जा रहा है, और @request शून्य है। जब मैं अपने अनुरोध चश्मे से सत्र तक पहुंचता हूं तो @request ActionController :: TestRequest का एक उदाहरण है।

मेरा प्रश्न है क्या मैं एक सहायक स्पेस से सत्र ऑब्जेक्ट तक पहुंच सकता हूं? अगर मैं कर सकता हूँ, कैसे? और अगर मैं इस विधि का परीक्षण करने का सबसे अच्छा अभ्यास नहीं कर सकता हूं?

****अद्यतन* ***

यह मेरा कारखानों में include ActionDispatch::TestProcess होने के लिए नीचे था। इसे हटाने में समस्या का प्रकार शामिल है।

+3

फैक्टरीगर्ल का उपयोग करके और "एक्शनडिस्पेच :: टेस्टप्रोसेस" के बिना फ़ाइलों को संलग्न करने के लिए, 'छवि {रैक :: टेस्ट :: अपलोड किया गया File.new (' spec/factories/test.png ',' image/png ')} ' , देखें: https://gist.github.com/rugginoso/4079399 और https://github.com/gregbell/active_admin/issues/512 –

उत्तर

3

मैं एक सहायक कल्पना से सत्र वस्तु का उपयोग कर सकते हैं?

हां।

module ApplicationHelper 
    def has_basket_items? 
    raise session.inspect 
    basket = Basket.find(session[:basket_id]) 
    basket ? !basket.basket_items.empty? : false 
    end 
end 

$ rspec spec/helpers/application_helper.rb 

Failure/Error: helper.has_basket_items?.should be_false 
    RuntimeError: 
    {} 

सत्र वस्तु वहां है और एक खाली हैश देता है।

त्रुटि खोजने के लिए बैकट्रैक की अधिक जानकारी में समीक्षा करने का प्रयास करें। stack level too deep आमतौर पर रिकर्सन घूमने का संकेत देता है।

+0

दुर्भाग्य से यह वही ढेर भी गहरी त्रुटि देता है। प्रत्यावर्तन डिबगिंग जो कहता है '@ request.session' और @request नहीं के बराबर है ActionDispatch :: TestProcess में सत्र विधि को जाता है। 'request.session' एक्शनडिस्पेच :: टेस्टप्रोसेस पर कॉल सत्र प्रतीत होता है और इसलिए यह लूप तब तक बहुत गहरा होता है जब तक ढेर बहुत गहरा नहीं होता है। इससे मुझे लगता है कि मुझे किसी भी तरह सहायक में एक सत्र इंजेक्ट करने की ज़रूरत है, लेकिन मुझे लगता है कि कैसे काम नहीं कर रहा है। –

+0

मैं अपने जवाब में कोड भाग गया और आउटपुट के रूप में खाली हैश मिला है। इससे पता चलता है कि आपके पर्यावरण में कुछ गलत हो सकता है। मैं एक नई परियोजना में एक स्वच्छ रेल स्थापित करने की कोशिश करता हूं, देखें कि समस्या अभी भी मौजूद है या नहीं। – zetetic

+0

ठीक है, तो प्रयोग का एक बिट के बाद मैंने पाया कि यह 'factory_girl_rails' मणि है कि मेरे सिर दर्द, जो बहुत कष्टप्रद है के रूप में मैं परीक्षण यह का उपयोग करता है की सैकड़ों उत्पन्न कर रहा है है। अगर इसके लिए किसी भी फिक्स है देखने के लिए जा रहा हूँ, नहीं तो ऐसा लगता है कि मैं कारखाने महिला के लिए एक स्थानापन्न खोजने के लिए जा रहा हूँ। मुझे सही दिशा बताने के लिए धन्यवाद। –

1

आप has_basket_items का परीक्षण कर रहे हैं? एप्लिकेशनहेल्पर में कार्रवाई, जो टोकरी टेबल में टोकरी_आईडी के साथ एक स्पीकिस टोकरी की जांच करती है, इसलिए आपके पास अपने परीक्षण में कुछ टोकरी ऑब्जेक्ट्स होनी चाहिए जिन्हें आप Factory_Girl मणि का उपयोग करके बना सकते हैं।

ऐश्वर्य एक उदाहरण है: -

basket1 = Factory(:basket, :name => 'basket_1') 
basket2 = Factory(:basket, :name => 'basket_2') 

आप कैसे इस स्क्रीन से factory_girl का उपयोग करने के बारे में अधिक जानकारी प्राप्त कर सकते हैं डाली http://railscasts.com/episodes/158-factories-not-fixtures

यह अपने परीक्षण डेटाबेस में एक फैक्टरी वस्तु का निर्माण करेगा। तो, मूल रूप से आप कुछ कारखाने वस्तुओं बना सकते हैं और फिर इस तरह अपने अस्तित्व के लिए जाँच करने के लिए सत्र में एक basket_id सेट:

session[:basket_id] = basket1.id 

तो, अपने परीक्षण इस तरह होना चाहिए: - वैकल्पिक रूप से

require 'spec_helper' 

describe ApplicationHelper do 
    describe 'has_basket_items?' do 
    describe 'with no basket' do 

     it "should return false" do 
     basket1 = Factory(:basket, :name => 'basket_1') 
     basket2 = Factory(:basket, :name => 'basket_2') 
     session[:basket_id] = 1234 # a random basket_id 
     helper.has_basket_items?.should be_false 
     end 

    end 
    end 
end 

, यदि आप एक basket_id जो का उपयोग करके be_true को factory_girl द्वारा बनाई जा रही है के लिए जाँच कर सकते हैं:

session[:basket_id] = basket1.id 
helper.has_basket_items?.should be_true 
+0

मैं अपने सुझाव की कोशिश की है लेकिन दुर्भाग्य से मैं एक ही परिणाम मिलता है। मैं क्या बता सकते हैं इस तथ्य यह है कि एक अनुरोध वस्तु मेरे सहायक में इंजेक्शन नहीं किया गया है बजाय वस्तुओं डेटाबेस में मौजूद नहीं है के लिए और अधिक हो रहा है। वास्तव में, काम करने के लिए मेरी विधि के लिए कोई टोकरी इकाइयां मौजूद नहीं होनी चाहिए। –