今回はインテグレーションテストにはCucumberを使わずRequestSpecを使ってみよーぜーということになった。Deviseでのユーザーをログインさせる方法を考えていたのだが、普通にログイン画面を開いてメアドとパスワードを打たせてログインしてから、さてさて…とやるのは時間がかかるだろうから、いい方法を調べよう!ということになったので、メモ。
参考にしたサイトは以下の通り。
- Devise認証なコントローラーをRSpecでテストする : さかなチキンぱん。
- rspec & devise test helpers
- Integration tests with Devise and RSpec
spec_helpers.rbに
RSpec.configure do |config| # Devise config.include Devise::TestHelpers, :type => :controller config.extend ControllerMacros, :type => :controller end
と書けば、というのはあくまでもコントローラーのテストの場合で、RequestSpecではうまくいかなかった。:type => :requestにしてもうまくいかなかった。その後、Warden::Test::Helpersをincludeしてやりなさいという記事を見つけたので、RequestSpec側のファイルで行ったところ、うまくいった。しかし、毎回全部のRequestSpecファイルに書くのは面倒だなーと思って模索していたのだが、ようやくそれっぽい解に辿り着いた。
まず、spec/supportフォルダ以下に、request_helpers.rbを作成し、そこにRequestHelpersモジュールを定義する。
# coding: utf-8
# spec/support/request_helpers.rb
include Warden::Test::Helpers
module RequestHelpers
def create_logged_in_user
user = FactoryGirl.build :user, :role => FactoryGirl.create(:role) # Cancan使ってるから権限もある
user.confirm!
user.save!
login(user)
user
end
def login(user)
login_as user, scope: :user, :run_callbacks => false
end
end
その後、spec_helpers.rbに以下を定義する。
RSpec.configure do |config| # Devise config.include Devise::TestHelpers, :type => :controller config.extend ControllerMacros, :type => :controller config.include RequestHelpers, :type => :request end
これで、適当なspec/requestsフォルダ以下のテストで、以下のようbeforeでcreate_logged_in_userメソッドを使えば、毎回ログイン処理をおこなってくれる。
# coding: utf-8
require 'spec_helper'
describe "Hoges" do
before do
create_logged_in_user
end
describe "GET /hoges" do
it "works! (now write some real specs)" do
get hoges_path
response.status.should be(200)
end
end
end
これでようやくテストをする下地ができたかなぁ〜という感じ。
