【问题标题】:warden is an undefined method issuewarden 是一个未定义的方法问题
【发布时间】:2023-01-07 00:03:22
【问题描述】:

一个应用程序使用 rails 7.0.4 和 devise 4.8。它在各种控制器操作中按预期进行身份验证。

但是,在测试(Minitest)中,无法达到用户正在登录的断言。

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

为 [...]ControllerTest[...] 返回 NameError: undefined local variable or method warden' 你的意思是? warn` 暗示系统不知道 warden 并且包含指令看起来实际上没有实际意义。

鉴于应用程序正在执行身份验证,此测试设置中明显缺少/错误的是什么?

【问题讨论】:

  • warden 方法似乎是 Warden::Test::Mock 的一部分,也许尝试包括它?注意:我没有使用 Warden 的经验

标签: ruby-on-rails devise


【解决方案1】:

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 测试助手真的应​​该被谨慎使用,通过跳过实际登录用户的步骤来使您的测试套件运行得更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 2011-07-22
    • 2012-03-16
    相关资源
    最近更新 更多