You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 5.1.6中用Shoulda Matcher、Minitest和Devise测试重定向遇错求助

解决Shoulda Matcher结合Devise的控制器重定向测试问题

咱们一步一步拆解并解决你遇到的两个测试错误:

第一个错误:Undefined method current_user for homecontrollertest

current_user是Devise专为控制器和视图层提供的方法,测试类本身并没有这个方法。你最初的测试直接在类级别的should块里调用current_user,此时既没有初始化控制器实例,也没有登录用户,自然会报错。

第二个错误:NoMethodError: undefined method users' for HomeControllerTest:Class`

你在context块里直接写user = users(:one),这是在类级别执行的代码,但users是fixture提供的实例方法,只能在测试实例的上下文(比如setup块、测试方法内部)中调用,所以会触发这个错误。

正确的测试代码写法

结合Shoulda Matcher和Devise测试助手,你需要把用户登录、请求调用放到实例级的setup或should块中,确保能正确访问fixture和Devise的方法:

require 'test_helper'

class HomeControllerTest < ActionController::TestCase
  include Devise::Test::ControllerHelpers

  context 'GET #index' do
    setup do
      # 在实例级setup中获取fixture用户并完成登录
      @user = users(:one)
      sign_in @user
      get :index
    end

    should redirect_to(action: "dashboard_#{@user.user_role}")
  end
end

补充测试场景(可选)

如果你需要测试未登录状态下的行为,可以单独新增一个测试上下文:

context 'GET #index when not logged in' do
  setup { get :index }

  should_not redirect_to(action: /dashboard_/)
  # 也可以根据需求断言渲染index页面:should render_template(:index)
end

内容的提问来源于stack exchange,提问作者Co2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:24:13