ruby-on-rails warden是一个未定义的方法问题

nwlls2ji  于 2023-01-10  发布在  Ruby
关注(0)|答案(1)|浏览(205)

一个应用程序使用rails 7.0.4和devices 4.8。它在各种控制器操作中按预期进行身份验证。
但是,在测试(Minitest)中,无法达到用户正在登录的Assert。

require "test_helper"

class ThisKlassControllerTest < ActionDispatch::IntegrationTest
  include Warden::Test::Helpers
  include Devise::Test::IntegrationHelpers

  test "should login " do
    sign_in(users(:one))
    assert warden.authenticated?(:user)
  end

返回NameError: undefined local variable or method 'warden' for [...]ControllerTest[...] Did you mean? warn,表示系统不知道warden,并且包含指令实际上没有实际意义。
假定应用程序正在执行身份验证,则此测试设置中明显缺少/错误的是什么?

jyztefdp

jyztefdp1#

Warden的工作方式是潜伏在Rack中间件堆栈的底部,并将自己注入到env中,这只是每个Rack中间件沿着到下一层的散列。
如果您确实想这样做,您可以通过以下请求访问Warden:

require "test_helper"

class ThisKlassControllerTest < ActionDispatch::IntegrationTest
  include Warden::Test::Helpers
  include Devise::Test::IntegrationHelpers

  test "should login " do
    sign_in(users(:one))
    assert request.env["warden"].authenticated?(:user)
  end

但是作为一个健全性测试,它是非常难闻的。你在这里太深入内部了。如果你想测试用户认证系统是否工作,那么就做一个更高级别的测试,比如他们可以编辑他们的个人资料。

class UserFlowsTest < ActionDispatch::IntegrationTest
  include Warden::Test::Helpers
  include Devise::Test::IntegrationHelpers

  test "a user should be able to edit their profile" do
    sign_in(users(:one))
    get '/user/edit'
    assert_response :success
  end

Warden测试助手确实应该少用一些,通过跳过实际登录用户的步骤来使测试套件运行得更快。

相关问题