我正在使用设计和添加authenticate_user的内容!在以下控制器中:
class RegistrationsController < Devise::RegistrationsController
before_action :authenticate_user!
def update
@user = User.find(current_user.id)
if @user.update(user_params)
sign_in @user, :bypass => true
redirect_to edit_user_registration_path, notice: 'Your account has been updated.'
else
render :edit
end
end
private
def user_params
params.require(:user).permit(:first_name, :last_name, :email)
end
end
路线是:
devise_for :users, controllers: { omniauth_callbacks: "authentications",
registrations: 'registrations' }
我有以下测试来验证身份验证是否正常工作:
require 'spec_helper'
describe RegistrationsController do
context 'Without being a signed in user' do
describe 'PATCH #update' do
let! (:user) { create(:user) }
it 'gets the correct flash message' do
patch :update, user: attributes_for(:user)
flash[:alert].should eql('You need to sign in or sign up before continuing.')
end
it 'redirects to the sign in page' do
patch :update, user: attributes_for(:user)
response.should redirect_to(new_user_session_path)
end
end
end
end
我有关注者用户工厂:
FactoryGirl.define do
factory :user do
first_name 'John'
last_name 'Smith'
sequence(:email) { |n| "John#{n}@example.com" }
password 'pw'
end
end
运行规范时出现以下错误:
Failures:
1) RegistrationsController Without being a signed in user PATCH #update redirects to the sign in page
Failure/Error: patch :update, user: attributes_for(:user)
NoMethodError:
undefined method `name' for nil:NilClass
# ./spec/controllers/registrations_controller_spec.rb:14:in `block (4 levels) in <top (required)>'
2) RegistrationsController Without being a signed in user PATCH #update gets the correct flash message
Failure/Error: patch :update, user: attributes_for(:user)
NoMethodError:
undefined method `name' for nil:NilClass
# ./spec/controllers/registrations_controller_spec.rb:9:in `block (4 levels) in <top (required)>'
before_action:authenticate_user!在他申请的其他部分正常工作。
答案 0 :(得分:0)
看起来测试失败了,因为我没有让Devise知道使用哪个映射我假设它正在测试不同控制器的更新方法。
Per the Devise docs:&#34;如果您正在测试Devise内部控制器或继承自Devise的控制器,您需要告诉Devise在请求之前应该使用哪个映射。这是必要的,因为Devise从路由器获取此信息,但由于功能测试不通过路由器,因此需要明确告知。&#34;
我需要在规范中添加@request.env["devise.mapping"] = Devise.mappings[:user]
。
以下规范有效:
context 'Without being a signed in user' do
describe 'PATCH #update' do
it 'gets the correct flash message' do
@request.env["devise.mapping"] = Devise.mappings[:user]
patch :update, user: { first_name: 'Steve', last_name: "Smith" }
flash[:alert].should eql('You need to sign in or sign up before continuing.')
end
it 'redirects to the sign in page' do
@request.env["devise.mapping"] = Devise.mappings[:user]
patch :update, user: { first_name: 'Steve', last_name: "Smith" }
response.should redirect_to(new_user_session_path)
end
end
end