2011-07-22 13 views
17

force_ssl featureをレール3.1rc4で利用したいと思います。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 

代わりのページをレンダリングする応答がhttps://test.host/から301リダイレクトです。

スペックを変更してHTTPS GET/POSTをシミュレートするにはどうすればよいですか?

また、手動で各テストを変更する必要がありますか、それとも簡単な方法がありますか? (私は、私が唯一の生産にforce_sslを呼び出すことができます実現し、それは理想的ではありません本当に、私はforce_sslが実際にhttpsにリダイレクトしないことをテストする必要があります。。//期待する場合)

答えて

39

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

あなたの例では、これは次のようになります。

RSpecの3構文について
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を使用していますが、常にこのエラーメッセージが表示されています: "undefined method' env for 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 gemを使用し、にRack::SSLミドルウェアを追加するだけです。追加のテストは必要ありません。破損することはありません。問題が解決しました。コントローラの仕様使用中のSSL要求を行うためにRSpecのを指示する

+0

おかげ@Justiceが、 'ラックssl'ソリューションの最終結果はRails.env.production場合FORCE_SSL'に違いはありません '、おそらくより簡単である:だから以下のコードを使用して?。いずれにしても、SSLリダイレクトのテストを可能にするために、本番環境をミラーリングするテストの方が優れていますか?これは私がやりたいことですが、rspecがHTTPS要求をシミュレートできる場合にのみ必要です。 – naudster

+1

正しい。しかし、それはポイントではありません。要点は、サイト全体がSSLで完全に運用されている場合、そのためのテストケースを書く必要はないということです。その宝石を必要とし、そのミドルウェアを実稼働環境で使用するだけでよいのです。覚えておいてください。これは、サイト全体がSSLを介している場合にのみ有効です。サイトの一部ではありません。ただし、一般的なセキュリティ原則として、サイトの一部がSSL経由である必要がある場合は、サイトの* all *がSSL経由である必要があります。 – yfeldblum

+0

これは残念なことに、普遍的な真の原則ではありません。それはもっと50%のオーダーです。パフォーマンスとスケーラビリティの理由から、パブリックリソースをキャッシュできるようにすることがよくあります。トラフィックの大半が認証されていないパブリック・トラフィック(かなり一般的なトラフィック・プロファイルです)である場合、ユニバーサルSSLは支払ったコストよりも高い場合があります。 – gtd

2

https://stackoverflow.com/a/28361428/1107433

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

上記のコードが動作しない若干異なるバージョンが存在することがあります。

get :index, protocol: :https

+0

私は 'protocol: 'https'を使って動作させなければなりませんでした –

+0

私はよくわかりません。私の仕事はうまくいく。しかし、私は答えを更新します。 –

関連する問題