Deviseのドキュメントでは、コントローラーのテスト時にcurrent_userにアクセスする方法に関するヒントを提供しています。
ただし、機能テストを行う場合はどうでしょうか?コントローラーのいずれかのcreateメソッドをテストしようとしていますが、そのコントローラーでcurrent_user変数が使用されています。
問題は、deviseで提案されているマクロが@request変数を使用しており、機能仕様としてはnilであるということです。回避策は何ですか?
編集:
これは私の現在の仕様についてこれまでのところ持っているものです:
feature 'As a user I manage the orders of the system' do
scenario 'User is logged in ad an admin' do
user = create(:user)
order = create(:order, user: user)
visit orders_path
#Expectations
end
end
問題は、私のOrdersController
にcurrent_user.orders
呼び出しがあり、current_user
が定義されていないため、/users/sign_in
にリダイレクトされることです。
/spec/features/manage_orders.rb
でこれを定義しました
私はあなたを正しく理解しているなら、多分あなたは使用する必要があります
subject.current_user.email
#or
controller.current_user.email
例えば :
describe OrdersController, :type => :controller do
login_user
describe "POST 'create'" do
it "with valid parametres" do
post 'create', title: 'example order', email: subject.current_user.email
end
end
end
controller_macros.rb:
module ControllerMacros
def login_user
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:user]
user = FactoryGirl.create(:user)
#user.confirm! # or set a confirmed_at inside the factory. Only necessary if you are using the "confirmable" module
sign_in user
end
end
end
これをspec_helper.rbに含めることを忘れないでください:
config.include Devise::TestHelpers, type: :controller
config.extend ControllerMacros, type: :controller
あなたが探していると思うものは次のとおりです。
require 'spec_helper'
include Warden::Test::Helpers
Warden.test_mode!
feature 'As a user I manage the orders of the system' do
scenario 'User is logged in ad an admin' do
user = create(:user)
login_as(user, scope: :user)
order = create(:order, user: user)
visit orders_path
#Expectations
end
end
login_userは、次のようにユーザーがログインするためのメソッドとして定義できます(サポートフォルダーに配置します)。
def login_user
Warden.test_mode!
user = create(:user)
login_as user, :scope => :user
user.confirmed_at = Time.now
user.confirm!
user.save
user
end
それからシナリオで言う:
user = login_user