2012-01-24 12 views
9

रेल 3.1 में force_ssl फ़ंक्शन को विकास पर्यावरण को अनदेखा करने के लिए हार्डकोड किया गया है, लेकिन परीक्षण नहीं किया गया है। यह मुझे मेरे (न्यूनतम) परीक्षणों में रीडायरेक्ट त्रुटियां दे रहा है। एसएसएल का समर्थन करने के लिए मेरा परीक्षण सर्वर स्थापित करने का समाधान है (यदि हां, तो कैसे?)। यदि नहीं, तो क्या मुझे परीक्षण में अनुरोधों को अनदेखा करने के लिए पैच force_ssl बंदर चाहिए?लोग रेलवे का परीक्षण कैसे कर रहे हैं 3.1 + force_ssl?

def force_ssl(options = {}) 
     host = options.delete(:host) 
     before_filter(options) do 
      if !request.ssl? && !Rails.env.development? 
      redirect_options = {:protocol => 'https://', :status => :moved_permanently} 
      redirect_options.merge!(:host => host) if host 
      flash.keep 
      redirect_to redirect_options 
      end 
     end 
    end 

संपादित इस श्रृंखला है, जो इस बात की पुष्टि अन्य लोग इस एक मुद्दा लगता है पाया जाता है, लेकिन वहाँ की तरह अभी तक एक प्रतिबद्ध ठीक नहीं लगती है: https://github.com/rails/rails/pull/2630

उत्तर

18

बंदर पूरा आवेदन पैचिंग के बजाय एक और विकल्प पर सिर्फ अकेले अपने परीक्षण सूट में force_ssl ओवरराइड करने के लिए है। उदाहरण के लिए, test/test_helper.rb में आप इस जोड़ सकते हैं:

# We don't want SSL redirects in our test suite 
module ActionController::ForceSSL::ClassMethods 
    def force_ssl(options = {}) 
    # noop 
    end 
end 
+1

यह एक बेहतर दृष्टिकोण की तरह लगता है – spike

+3

मेरे पास यह अंत में है मेरी test_helper.rb फ़ाइल का, और सभी स्पार्क के साथ अच्छी तरह से चल रहे चश्मे हैं। लेकिन बस rspec चल रहा है यह अनदेखा प्रतीत होता है। कोई विचार क्यों? – Owen

4

है यही कारण है कि मैं क्या कर रहा समाप्त हो गया हाल ही में करने के लिए अपग्रेड करने के बाद रेल 3.1 और force_ssl फ़िल्टर पर स्विचिंग। बचाव के लिए बंदर पैच!

एक नई फ़ाइल में config/initializers/ignore_force_ssl_in_test.rb

module ActionController 
    module ForceSSL 
    module ClassMethods 
     def force_ssl(options = {}) 
     before_filter(options) do 
      if !request.ssl? && !Rails.env.development? && !Rails.env.test? 
      redirect_to :protocol => 'https://', :status => :moved_permanently 
      end 
     end 
     end 
    end 
    end 
end 
+0

बढ़िया, यह मेरे लिए काम करता है। मैं आपका जवाब स्वीकार करने जा रहा हूं, लेकिन अगर यह रेल में शामिल हो जाता है तो मैं वापस आऊंगा और एक नोट – spike

+0

जोड़ूंगा यह यूआरएल में किसी भी पैरामीटर को छोड़ देगा, मुझे पूरा यकीन है। इस लिंक को इसके चारों ओर प्राप्त करने के लिए देखें: http://stackoverflow.com/questions/11252910/rails-redirect-to-https-while-keeping-all-parameters –

16

यहाँ, एक और तरीका है अगर तुम नहीं गड़बड़ करने के लिए बंदर पैचिंग के साथ ... आप फिल्टर से पहले एक उपयोग कर सकते हैं चाहता हूँ। यह rspec, नहीं minitest वाक्य रचना है, लेकिन आप अंदाजा हो:

before(:each) do 
    request.env["rack.url_scheme"] = "https" 
end 

यह आपके नियंत्रक है कि यह एक SSL अनुरोध मिला मना।

इस दृष्टिकोण को लेने का लाभ यह है कि आप वास्तव में एक परीक्षण लिख सकते हैं ताकि आपके नियंत्रक को एसएसएल की आवश्यकता हो। :)

+0

आपने यह कहां रखा? मुझे 'NameError: अपरिभाषित स्थानीय चर या विधि 'अनुरोध' –

4

यदि आप अलग-अलग एसएसएल के साथ परीक्षण करने में रुचि रखते हैं, तो मैंने इसे कार्यात्मक परीक्षण के सेटअप पर किया।

def setup 
    @request.env['HTTPS'] = 'on' 
end 
3

क्या मेरे लिए काम किया Kelly Sutton's के समान है। मैं बंदर पैच force_ssl परीक्षण परिवेश में SSL अनुरोधों की अनदेखी करने, अन्यथा मूल रेल कार्यान्वयन का उपयोग करें:

module ActionController 
    module ForceSSL 
    module ClassMethods 
     alias_method :original_force_ssl, :force_ssl 

     def force_ssl(options = {}) 
     unless Rails.env.test? 
      original_force_ssl(options) 
     end 
     end 
    end 
    end 
end 
+0

रायन का दृष्टिकोण इसी तरह दिखता है सिवाय इसके कि उसका कोड केवल परीक्षण वातावरण में चलता है। मुझे लगता है कि test.rb में अपना ब्लॉक डालने से सभी वातावरण में आपके ब्लॉक को चलाने से बेहतर है? – spike

+0

रयान का दृष्टिकोण मेरे लिए काम नहीं करता क्योंकि 'force_ssl' एक क्लास विधि है। spec_helper.rb रेल पर्यावरण को पहले लोड करेगा, फिर आपका कोड, इस प्रकार प्रभावी रूप से मूल 'force_ssl' को कॉल करेगा और spec_helper.rb – gylaz

+0

में परिभाषित नहीं किया गया यह एकमात्र समाधान है जो यहां पोस्ट किया गया है जो मेरे लिए काम करता है। रेल 3.2.13 और कैपेबरा और सेलेनियम के साथ रुपेक। धन्यवाद! – n8gard

0

आप एसएसएल का उपयोग कर ऐप पर टेस्ट कॉल कर सकते हैं!get 'https://eample.org/my/route/here'

  • या https!(true) का उपयोग करें और https!(false) में प्रोटोकॉल https://eample.org/my/route/here साथ

    • उपयोग पूर्ण uri गतिशील एकीकरण की जांच

      https!(true) 
      get "/users" 
      https!(false) 
      

    में व्यवहार बदलने के लिए नियंत्रक के आप SSL का उपयोग करने की जरूरत नहीं है, क्योंकि (मुझे लगता है) वे सीधे रूटिंग और अन्य स्थानांतरण सामग्री के बिना विधि के रूप में कार्रवाई कहते हैं।

  • 0

    रेल डॉक्स का उपयोग करने की सलाह देते हैं यदि: ssl_configured? force_ssl कॉल के साथ। आप तब कर सकते हैं:

    def ssl_configured? 
        !Rails.env.development? && !Rails.env.test? 
        end 
    

    आधिकारिक उत्तर के रूप में बंदर पैच के बिना संकेत मिलता है।

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