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
相关产品推荐
相关产品推荐

