【问题标题】:What does line do? `:@request.env["devise.mapping"] = Devise.mappings[:user] `线是做什么的? `:@request.env["devise.mapping"] = Devise.mappings[:user] `
【发布时间】:2020-09-30 01:51:41
【问题描述】:

我正在审查 rspec 测试并试图了解以下代码的作用。

  before do
    @request.env["devise.mapping"] = Devise.mappings[:user]
    setup_controller_for_warden
    @user = create(:user)  
  end

【问题讨论】:

  • 这似乎是一个让 Devise 与控制器规范一起工作的 hacky 解决方案。设计是基于中间件的,控制器测试不通过中间件堆栈。如果您有一个带有控制器规格的遗留应用程序,您希望包含include Devise::Test::ControllerHelpers。对于新应用程序,Rails 团队不鼓励您使用集成测试/规范作为控制器测试/规范。
  • 请注意,添加include Devise::Test::ControllerHelpers 将不允许您删除@request.env["devise.mapping"] = Devise.mappings[:user]。无论如何,对于主题是设计控制器或从设计控制器继承的控制器的任何控制器测试,它都应该存在

标签: ruby-on-rails devise ruby-on-rails-6


【解决方案1】:

Devise documentation 建议您在测试 Devise 控制器或从 Devise 控制器继承的控制器时添加 @request.env["devise.mapping"] = Devise.mappings[:user]

如果您正在测试Devise 内部控制器或继承自Devise 的控制器,您需要在请求之前告诉Devise 应该使用哪个映射。这是必要的,因为 Devise 从路由器获取此信息,但由于控制器测试不通过路由器,因此需要明确说明。

在某些情况下,gem 本身也会发出警告:

Could not find devise mapping for path #{request.fullpath.inspect}.
This may happen for two reasons:

1) You forgot to wrap your route inside the scope block. For example:

  devise_scope :user do
    get "/some/route" => "some_devise_controller"
  end

2) You are testing a Devise controller bypassing the router.
   If so, you can explicitly tell Devise which mapping to use:

   @request.env["devise.mapping"] = Devise.mappings[:user]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 2016-03-14
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多