RSpecでsessionを使用したテスト(ログイン機能)

内容としてはajaxのテストを書こうとして、それにはsessionが必要というような場合です。(渡しの場合、ログインしていないとajax通信ができないという仕様でした。)
 

ここけっこう困って、前回こういったsessionを使うテストを実装した際にはgrapeというRails向けのREST APIフレームワークを使っていたのでこれはまた別問題でした。(grapeはrackを使ってsession設定できます)
 


想定したアプローチは2つあって

  • controller specを使ってテスト

  • postで実際にログインさせてからテストを実行

1つ目はやってみたのですがテスト内ではsessionを使えたのですがアプリ内での引き継ぎができなくてうまくいきませんでした、が、ブログ書きながらちょろちょろ調べて見てると出来そうな雰囲気もあるのでまた次回試してみます。。

2つ目が今回の実装でやったのですが、挙動的にはこっちのほうがいいのかなと。

require 'spec_helper'

describe CalendarController do
  before do
    @user = create(:user)
    post '/login', {:username => @user.name, :password => @user.password}
  end

  context 'create' do
    …
    it do
      xhr :post, 'hoge/fuga', {:hoge => 1, :fuga => 'fuga'}
      expect(response.body).to eq({:success => true, :data => {…}.to_json})
      response.code.should == "200"
    end
  end

end 

というような感じです。 実際のログインユーザーが行う処理という流れに沿っている分テスト的には良いかなと思いました。 xhrでajax通信を使ったgetやpostが行えます。その後に中身とステータスコード200をチェックしているというような形です。
 

ただ、普通にsession[:calendar_id]みたいなのを使いたいというような時は1つ目のアプローチが必要と思いますので、また解決し次第ブログに書きたいと思います。