运行Minitest断言失败:期望渲染admin/dashboard却得到<[]>
问题分析与解决方案
首先,你的测试失败的核心原因是登录验证未通过,导致访问admin dashboard时被重定向,根本没触发目标模板的渲染。我们来一步步拆解问题:
1. 密码不匹配是关键诱因
看你的admins.yml fixture配置:
admn: username: "adminm" password_digest: <%= Admin.digest('admin') %>
这里生成密码哈希的原始密码是admin,但测试代码里用的登录密码却是'Ha66y@Air':
post login_admin_path, params: { session: { username: @admin.username, password: 'Ha66y@Air' } }
两者完全不匹配,所以登录逻辑直接走到了else分支,只渲染了登录页面,并没有真正登录成功。后续访问admin_dashboard_path时,Admin控制器的dashboard方法会执行redirect_to root_url unless logged_in?——因为未登录,触发了重定向,自然不会渲染admin/dashboard模板,最终导致断言失败。
2. 具体修复步骤
步骤一:统一测试密码与fixture密码
二选一即可:
- 要么把测试里的登录密码改成
'admin',和fixture的原始密码对齐:post login_admin_path, params: { session: { username: @admin.username, password: 'admin' } } - 要么保持测试密码为
'Ha66y@Air',更新fixture里的密码哈希:admn: username: "adminm" password_digest: <%= Admin.digest('Ha66y@Air') %>
步骤二:添加登录状态断言(可选但推荐)
在登录后加一行断言,确认登录状态,方便后续排查类似问题:
post login_admin_path, params: { session: { username: @admin.username, password: 'admin' } } assert logged_in? # 验证是否成功登录
步骤三:调整flash消息位置(代码优化)
你的登录控制器里,flash.now[:danger]写在了render之后,这会导致flash消息无法正确显示(虽然不是本次测试失败的原因,但属于代码小问题),调整顺序:
else flash.now[:danger] = 'Invalid email/password combination' render 'login/admin' end
3. 验证修复效果
修改完成后重新运行测试,登录会成功触发,访问admin_dashboard_path时会正常渲染admin/dashboard模板,断言就能顺利通过了。
内容的提问来源于stack exchange,提问作者L11
相关产品推荐
相关产品推荐

