web-dev-qa-db-ja.com

RSpec設定セッションオブジェクト

コントローラの仕様からセッションオブジェクトを設定しようとしています。

it 'use invalid coupon' do
  session[:coupon] = 'abcd'      
  Service.any_instance.stub(:validate_coupon).with(session[:coupon]).and_return('abcd')

  get :index
  expect(flash[:coupon__notice]).to be nil
end

しかし、@ couponオブジェクトの代わりにセッションを検査すると、文字列「coupon」を含む@dataが取得され、テストは失敗します。

31
parov

これは テストのガイドRailsアプリケーション セクション4「コントローラーの機能テスト。getアクションはparamsハッシュandセッションハッシュ、例えば:

get(:show, {'id' => "12"}, {'user_id' => 5})

例のparamsハッシュにnilを渡してから、目的のセッションパラメーターを渡せるようにする必要があります。

get :index, nil, {coupon: 'abcd'}

Railsテスト用のRSpecを使用するすべての人のためのRailsガイドを徹底的に読むことをお勧めします。rspec-Railsは既存のRailsテストクラス、rspec-Railsドキュメントではあまり明確にされていないポイント。

54
zetetic

Rails 5 +、ActionController::TestCaseを使用している場合、セッションはキーワード引数として渡されます。

パラメータとセッションの設定は次のようになります。

get(:show, params: {'id' => "12"}, session: {'user_id' => 5})

セッションのみの設定は次のようになります。

get(:show, session: {'user_id' => 5})

コントローラーテストの新しいデフォルトであるActionDispatch::IntegrationTestを使用している場合、セッション変数を設定できるnotであり、ログインフローをテストして設定する必要があります。

37
HParker

次のように@requestオブジェクトを使用することもできます

@request.session['coupon'] = 'abcd'
15
Vignesh Jayavel

次のこともできます。

request_params = { city: 'Bomet', code: '023' }
session_params = { taxes_paid: 'No' }

その後、あなたの仕様であなたができること:

get :edit, request_params, session_params

機能では、session[:taxes_paid]を使用してセッションにアクセスできます

0
Ruto Collins