Authlogicが関わるテストをCapybaraで行っている時に、各テストをまたいでログイン状態が継続される場合があるので対応する

Authlogicが関わるテストをCapybaraで行っている時に、各テストをまたいでログイン状態が継続される場合があるので対応する

  • rails 4.2.5.2
  • authlogic 3.4.6
  • rspec 3.4.0
  • capybara 2.6.2
  • poltergeist 1.9.0
  • phantomjs 2.0.0

下記はCapybaraを用いたFeature specでのことです。 Controller specではAuthlogic::TestCaseが提供するメソッドで軽量にログインが行えます。

なおspec/supports以下のhelperなどはspec/rails_helper.rbで明示的に読み込ませることで有効になります。

Dir[Rails.root.join('spec/supports/**/*.rb')].each(&method(:require))

直接Cookieを編集してログイン状態としている

テストにおいてログイン状態が必要な場合、Web APIなどを介してログインを行うなどしていると積み重なって結構な時間になります。

そのような理由から、テストの際にはCookieを直接編集してログイン状態を作りだします。

require "authlogic/test_case"
include Authlogic::TestCase
def authlogic_login(user)
  activate_authlogic
  UserSession.create!(user)
  credential = [user.persistence_token, user.id].join('::')

  begin
    cookies['user_credentials'] = credential
  rescue
    page.driver.set_cookie('user_credentials', credential)
  end
end

このCookieが次のテストでも継続する場合があります。

ぬかりなくCookieを消す

ログアウトは、ログインと同じくCookieを直接編集することで行えます。 ログインするテストではログアウトを書く、というのでは忘れるので、after :eachで毎回行われるようにします。

同じくhelperを書きます。 ただしcookiespage.driverがない状況でもとにかく毎回終了時に呼ばれるので、これが原因でテストが落ちないようにします。

def authlogic_logout
  begin
    cookies['user_credentials'] = ''
  rescue
    page.driver.set_cookie('user_credentials', '') rescue nil
  end
end

乱暴ですね。

spec/rails_helper.rbのコンフィグを利用して、どのテストでも毎回クリアされるようにします。

RSpec.configure do |config|
  ...
  config.after :each do
    authlogic_logout
  end
end

なお大阪では海遊館でカピバラに会えます

行こう海遊館(前回書きそこねた)

IMAG0129.jpg