web-dev-qa-db-ja.com

カピバラでセッション値を設定するにはどうすればよいですか?

Shopify用のアプリを開発していて、統合テストを行いたいと思っています。

認証が機能するように、セッション変数にいくつかの値を格納できる必要があります。

どうすればそれができますか?

私はCapybaraとCapybara-webkitを使用しています。

28
Nerian

見つかったばかり rack_session_access 宝石で、チャームとして機能しています。

22
fguillen

受け入れられた答えは 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
27
ronen

私は悪いニュースをもたらすのではないかと心配していますが、カピバラのドキュメントから:

テストからセッションとリクエストにアクセスできません。レスポンスへのアクセスが制限されています。

そのため、期待どおりにテストすることはできません。


考えてみてください。テスト目的でコントローラーに条件ステートメントを挿入することは許容されます。

 session[:foo] = User.first.id if Rails.env.test?

より良いオプションは、統合テストのためだけにコントローラーにモンキーパッチを適用することです。

4
apneadiving

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質問が役立つ場合があります。

4
SnapShot

VCRやwebmockなどを使用して、外部httpリソースへの呼び出しをスタブ化できます。

4
Brice Stacey