2013-01-31 72 views
2

我希望Rspec使用https請求根。這是我目前有:使用RSpec測試HTTPS(SSL)請求的簡單方法

it "requesting root (/) with HTTPS should return 200" do 
    get "https://test.host/" 
    last_response.should be_ok 
end 

試圖在Test an HTTPS (SSL) request in RSpec Rails返回以下錯誤提出的解決方案:

wrong number of arguments (0 for 1) 

我假設我可以這樣做:

get "/", :https => "on" 

有沒有指定主機請求根的方式?

+0

我不知道,但你張貼給予解決我會使用,這是使整個網站需要鏈接的意見中提出的問題SSL整個時間。那麼你不需要像這樣做一個特殊的檢查。 – iain

+0

不幸的是我不能那樣做。某些部分需要針對HTTP進行測試,其他部分則針對HTTPS進行測試。 –

+0

您是否試圖測試它只接受安全連接?無論如何,功能都是一樣的,所以也許你可以通過關閉SSL的要求來測試功能,然後檢查使用的安全連接,重新打開SSL要求,然後檢查當你有301重定向撥打非SSL電話? – iain

回答

5

當使用西納特拉和RSpec,您使用的是Rack::Test提供的#get/#post方法,所以我建議你看看那裏看看它們是如何工作:https://github.com/brynary/rack-test/blob/master/lib/rack/test.rb

正如你所看到的,他們採取一個可選的env哈希,其中你可以設置「HTTPS」爲「開」,像這樣:

get '/', {}, {'HTTPS' => 'on'} 

如果你想在默認情況下爲所有請求設置它,你需要重寫Rack::Test::Session#default_env方法,並有'HTTPS' => 'on'它(我建議在您的spec_helper.rb中進行),如下所示:

class Rack::Test::Session 
    def default_env 
    { "rack.test" => true, "REMOTE_ADDR" => "127.0.0.1", "HTTPS" => 'on' }.merge(headers_for_env) 
    end 
end 
+1

謝謝。我不想弄亂通常的默認設置,所以我用'Rack :: Test :: Session.prepend MyEnvModule'使用'super.merge(「HTTPS」=>'on')'' –

3

以前的答案與Rack::Test:Session更改對我來說並不適用於rails 4.1.1。相反,我現在使用Rails RSpec綁定強制所有集成測試進入https。要做到這一點下面的代碼添加到spec_helper.rb

class ActionDispatch::Integration::Session 
    def https? 
    true 
    end 
end