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を書きます。
ただしcookies
やpage.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
なお大阪では海遊館でカピバラに会えます
行こう海遊館(前回書きそこねた)