2012-11-10 15 views
10

रेल 3 लेआउट में तर्क का परीक्षण करने का सबसे अच्छा तरीका क्या है?एक लेआउट का परीक्षण करने के लिए आरएसपीसी का उपयोग

उदाहरण: जब कोई उपयोगकर्ता मेरी साइट पर साइन इन करता है, अगर उन्होंने ऑनबोर्डिंग प्रक्रिया पूरी नहीं की है तो मैं उन्हें सभी पृष्ठों पर स्क्रीन के शीर्ष पर एक अलर्ट दिखाता हूं। यह तर्क एप्लिकेशन लेआउट में रखा गया था। मैं बस एक विशेष कुंजी के लिए लॉग इन उपयोगकर्ता की जांच करता हूं। यदि कुंजी मौजूद नहीं है तो मैं अलर्ट दिखाता हूं। जैसे ही कुंजी मौजूद है (जिसका अर्थ है कि उन्होंने ऑनबोर्डिंग पूरी की है) मैं अलर्ट नहीं दिखाता हूं।

वर्तमान में मैं एक दृश्य के परीक्षण के साथ ऐसा करने का प्रयास कर रहा हूँ, लेकिन मैं नहीं के बराबर के लिए ActionView::Template::Error: undefined method प्रमाणित 'के सभी प्रकार के हो रही है: आवेदन लेआउट सहित द्वारा NilClass` त्रुटियों और मैं नहीं कर सकते इस सुविधा का परीक्षण करने लगते हैं।

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

कोड है कि मैं अपने लेआउट में परीक्षण करने के लिए कोशिश कर रहा हूँ इस तरह दिखता है: और

<% if user_signed_in? %> 
    <% unless current_user.has_completed_onboarding? %> 
     <div class="alert"> 
     You cannot accept payments from your clients until you set up your payment gateway. 
     <%= link_to "Set up your", payment_gateway_path %> payment gateway. Its quick, we promise. :) 
     </div> 
    <% end %> 
<% end %> 

मुझे यकीन है कि अगर वे ज्ञानप्राप्ति विवरण नहीं उपलब्ध कराए गए हैं कि इस संदेश दिखाई देगा बनाना चाहते हैं तो वे प्रदान किया गया, तो यह संदेश न दिखाएं।

उत्तर

14

आप किसी भी अन्य दृश्य की तरह अपने लेआउट का परीक्षण कर सकते हैं। बस एक फ़ाइल application.html.erb_spec.rb (haml द्वारा erb की जगह यदि आवश्यक हो) spec/views/layouts/ में बनाते हैं, और उस फ़ाइल में सामान्य रूप से अपने चश्मा लिखना, जैसे:

require 'spec_helper' 

describe 'layouts/application' do 

    context 'signed-in user' do 

    before { view.stub(:user_signed_in?) { true } } 

    context 'completed onboarding' do 

     before do 
     user = double('user') 
     user.stub(:has_completed_onboarding?) { false } 
     assign(:current_user, user) 
     end 

     it "should display alert" do 
     render 
     rendered.should have_selector('.alert') 
     end 

    end 

    ... 

    end 

    context 'signed-out user' do 
    ... 
    end 

    ... 

end 

मैं अपने एप्लिकेशन में से एक के साथ ऐसा कर और यह कोई काम करता है समस्या, इसलिए मुझे नहीं पता कि यह आपके मामले के लिए भी क्यों काम नहीं करेगा।

2

आपको मिली ActionView::Template::Error: undefined method authenticate for nil:NilClass त्रुटि में user_signed_in? विधि कॉल के कारण त्रुटि हुई है। @shioyama कोड में दिखाए गए अनुसार आप अपने परीक्षणों में user_signed_in? विधि को दबाकर इसे संभाल सकते हैं।

निम्न कोड से पता चलता user_signed_in? विधि ठूंठ और वापसी true यदि आप यदि आप नहीं if बयान अपने ध्यान में रखते हुए false चाहता था निष्पादित करने के लिए या करने के लिए कैसे। view.stub(:user_signed_in?).and_return(true)

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