Shopify用のアプリを開発していて、統合テストを行いたいと思っています。
認証が機能するように、セッション変数にいくつかの値を格納できる必要があります。
どうすればそれができますか?
私はCapybaraとCapybara-webkitを使用しています。
見つかったばかり rack_session_access 宝石で、チャームとして機能しています。
受け入れられた答えは rack_session_access を示唆しています。ミドルウェアコントローラーを挿入してセッション状態を編集および更新し、capybaraにそのページにアクセスして、セッションデータを含むフォームを送信することで機能します。とても独創的です!ただし、Wardenを(直接またはDeviseを介して)使用している場合は不要です。
Wardenにはフックがあります on_next_request これは、セッションキーを直接設定するために使用できるWardenメカニズムへのアクセスを提供します。私はこれを一緒に投げてrspecにバンドルしました:
作成spec/support/inject_session.rb
:
module InjectSession
include Warden::Test::Helpers
def inject_session(hash)
Warden.on_next_request do |proxy|
hash.each do |key, value|
proxy.raw_session[key] = value
end
end
end
end
spec/spec_helper.rb
モジュールを機能仕様に含めます。
RSpec.configure do |config|
config.include InjectSession, :type => :feature
end
その場合、仕様でのサンプルの使用は次のようになります。
inject_session :magic => 'pixie dust', :color => 'pink'
visit shopping_cart_path
page.should be_all_sparkly_and_pink # or whatever
私は悪いニュースをもたらすのではないかと心配していますが、カピバラのドキュメントから:
テストからセッションとリクエストにアクセスできません。レスポンスへのアクセスが制限されています。
そのため、期待どおりにテストすることはできません。
考えてみてください。テスト目的でコントローラーに条件ステートメントを挿入することは許容されます。
session[:foo] = User.first.id if Rails.env.test?
より良いオプションは、統合テストのためだけにコントローラーにモンキーパッチを適用することです。
Apneadivingによるコメントが推奨するように、カピバラを使用して「直接」フォームに記入する必要があります。 Cucumberを使用したテストは、認証用のログインフォームに入力するために次のようになります( Capybara githubページから):
When /I sign in/ do
within("#session") do
fill_in 'Login', :with => '[email protected]'
fill_in 'Password', :with => 'password'
end
click_link 'Sign in'
...
end
別のことをしようとしている場合、または通常のログインプロセスで問題が発生している場合は、 this SO質問が役立つ場合があります。
VCRやwebmockなどを使用して、外部httpリソースへの呼び出しをスタブ化できます。