Rails 6+Devise项目运行RSpec视图测试出现Warden缺失报错如何解决?
问题原因
你之前引入的Devise::Test::ControllerHelpers仅作用于类型为:controller的测试,而你当前运行的是视图测试,对应类型为:view,因此Devise的登录态注入逻辑没有生效,无法获取到Warden实例。
修复方案
提供两种适配Rails 6的修复方式,可根据场景选择:
方案1:引入Devise Helper 模拟真实登录态
适合需要测试和Devise认证强关联的视图逻辑的场景:
- 修改
rails_helper.rb配置,新增针对视图测试的Helper引入:
RSpec.configure do |config| # 保留你原有针对控制器的配置,新增下面这行 config.include Devise::Test::ControllerHelpers, type: :view # 确保开启目录自动推断测试类型,就不用在每个spec文件手动写type: :view config.infer_spec_type_from_file_location! end
- 在视图测试文件中提前完成登录模拟:
# spec/views/agent_quotes/edit.html.erb_spec.rb require 'rails_helper' RSpec.describe "agent_quotes/edit", type: :view do # 若无FactoryBot可替换为User.create(必要字段) let(:test_user) { create(:user) } let(:agent_quote) { create(:agent_quote, user: test_user) } before do sign_in test_user # 调用Devise提供的登录方法注入认证态 assign(:agent_quote, agent_quote) # 给视图赋值需要的业务实例变量 end it "正常渲染编辑表单" do render # 你的业务断言逻辑 end end
方案2:直接给视图注入current_user(更轻量,推荐视图测试使用)
视图测试核心是验证渲染逻辑,不需要走完整的Devise认证流程,可直接给视图赋值current_user变量绕开Warden查找,无需修改全局配置:
# spec/views/agent_quotes/edit.html.erb_spec.rb require 'rails_helper' RSpec.describe "agent_quotes/edit", type: :view do let(:test_user) { create(:user) } let(:agent_quote) { create(:agent_quote, user: test_user) } before do assign(:agent_quote, agent_quote) # 直接给视图注入current_user返回值,跳过Devise认证逻辑 allow(view).to receive(:current_user).and_return(test_user) end it "正常渲染编辑表单" do render # 你的业务断言逻辑 end end
内容的提问来源于stack exchange,提问作者RichT
相关产品推荐
相关产品推荐

