使用令牌和 SimpleTokenAuthentication 登录用户的测试失败,因为 SimpleTokenAuthentication 未登录用户

Tests for signing in User using token and SimpleTokenAuthentication failing because SimpleTokenAuthentication not signing in user

Rails 5.2 gem: SimpleTokenAuthentication

我有以下控制器:

class RegistrationsController < ApplicationController
  acts_as_token_authentication_handler_for  User, only: [:start]
  
 

  def start
    binding.pry
    if user_signed_in?
      redirect_to edit_user_path(current_user)
    else
      redirect_to new_user_session_path
    end
  end

end

我有一个 link 页面,其中 user_email 和 user_token 参数填充了适当的数据。

当我单击 link 时,如果令牌有效且电子邮件属于数据库中的某个用户,acts_as_token_authentication_handler_for 用户会登录该用户。

但是,当我尝试 运行 一个简单的 rspec 测试时,我收到一个内部服务器错误。

这是 Rspec 测试:

RSpec.describe 'Registering New Staff' do

  let(:new_user) { create(:user) }

  describe 'accessing the registration start page' do

    it 'redirects to the edit user path when user signed in' do
      params = { user_email: new_user.email, user_token: new_user.authentication_token }
      get start_registration_path(params)
      expect(response).to redirect_to(edit_user_path(new_user))
    end
  end

这是我得到的错误:

  Failure/Error: expect(response).to redirect_to(edit_user_path(new_user))
       Expected response to be a <3XX: redirect>, but was a <500: Internal Server Error>

acts_as_token_authentication_handler_for 的登录过程似乎出了问题,但我无法弄清楚。

感谢任何帮助。

最后我没有使用 SimpleTokenAuthentication 而是使用了我自己的代码如下:

class RegistrationsController < ApplicationController 
  before_action :authenticate_user_from_token!, only: [:start]

  def preview
  end

  def start
    authorize :registration
    if user_signed_in?
      redirect_to edit_user_path(current_user)
    else
      raise Pundit::NotAuthorizedError
    end
  end

  def calendar
    authorize :registration
  end

  def confirmation
    authorize :registration
    current_user.register
  end


  private

  def authenticate_user_from_token!
    sign_out current_user if user_signed_in?
    if user && Devise.secure_compare(user.authentication_token, params[:user_token])
      sign_in user 
      @current_user = user
      renew_authentication_token
    end
  end

  def user
    @user ||= User.find_by(email: params[:user_email])
  end

  def renew_authentication_token
    current_user.renew_authentication_token!
  end

end