2011-07-22 74 views
17

我想利用rails 3.1rc4中的force_ssl feature測試RSpec Rails中的HTTPS(SSL)請求

class ApplicationController < ActionController::Base 
    force_ssl 
end 

問題是這打破了我現有RSpec控制器規格的大部分/全部。例如,此操作失敗:

describe "GET 'index'" do 
    it "renders the Start page" do 
    get :index 
    response.should render_template 'index' 
    end 
end 

渲染頁面,而不是響應是301重定向到https://test.host/

如何更改我的規格以模擬HTTPS GET/POST?

我是否必須手動更改每項測試,還是有更簡單的方法? (我知道我只能在生產中調用force_ssl,但這並不理想,真的,我應該測試force_ssl是否確實在預期時重定向到https://)

回答

39

要指示的RSpec使SSL請求控制器中的規範使用:

request.env['HTTPS'] = 'on' 

在你的榜樣,這看起來像:

describe "GET 'index'" do 
    it "renders the Start page" do 
    request.env['HTTPS'] = 'on' 
    get :index 
    response.should render_template 'index' 
    end 
end 
+0

這不適用於RSpec 2.10。看到這裏:https:// github。com/rspec/rspec-rails/issues/534 –

+2

我正在使用rspe 2.11.0,我總是收到以下錯誤消息:「未定義的方法'env'爲nil:NilClass」。 –

+1

注意到這是用Rails-rspec 2.14和Devise 3.0.0修復的 https://github.com/rspec/rspec-rails/issues/534#issuecomment-21560832 –

0

如果您需要SSL,應用程序,您應該在應用程序的任何地方使用它。然後,您只需使用rack-ssl寶石,並將Rack::SSL中間件添加到您的config/environments/production.rb。無需額外的測試;不破損;問題解決了。

+0

感謝@Justice,但'機架ssl'解決方案的最終結果是'force_ssl沒有什麼不同,如果Rails.env.production'這可能是更容易?無論如何,測試鏡像製作不是更好的做法,允許您測試SSL重定向嗎?這是我想要做的,但只有當rspec能夠模擬HTTPS請求。 – naudster

+1

正確。但那不是重點。問題是,如果整個網站在生產中完全採用SSL,那麼您無需爲此編寫任何測試用例。只需要在生產環境中使用該中間件,就可以開始使用該中間件。請記住,這隻適用於整個網站是通過SSL,而不僅僅是您的網站的一些部分。但是,作爲一般安全原則,如果您的站點的任何部分需要通過SSL,那麼您的所有站點都需要通過SSL。 – yfeldblum

+0

這不幸並不是一個普遍真實的原則。這大約是50%。很多時候,您希望具有可用於性能和可伸縮性原因的可緩存的公共資源。如果您的大部分流量都是未經身份驗證的公共流量(這是相當常見的流量配置文件),那麼通用SSL的成本可能會高於您想要支付的成本。 – gtd

2

對於RSpec的3語法,https://stackoverflow.com/a/28361428/1107433

get :index, protocol: 'https://' 

上面的代碼可能有些微不同,上面的代碼不起作用。因此,使用下面的代碼:

get :index, protocol: :https

+0

我不得不使用'protocol:'https''來啓動它 –

+0

我不確定。我的工作很好。但我會更新答案。 –