使用Jest测试App组件时登录成功后为何跳转回登录页?
登录流程测试重定向问题排查修复方案
- 修复异步点击逻辑
userEvent.click为异步方法,你当前将其包裹在同步act()中未等待执行完成,会导致登录请求、鉴权状态更新逻辑还未执行完就提前通过了路径校验,后续鉴权逻辑生效后检测不到有效凭证就触发重定向。将点击登录按钮的代码替换为以下内容即可,userEventv14+ 会自动处理act包裹,无需手动加:
// 删掉原有的act包裹代码,替换为下面的 await userEvent.click(button)
- 补充鉴权存储模拟逻辑
jsdom默认不会持久化localStorage/sessionStorage/cookie,如果你的鉴权凭证是存在这三类存储中,要在测试前清空旧存储,避免历史数据干扰:
beforeEach(() => { // 清空所有存储 window.localStorage.clear() window.sessionStorage.clear() // 清空所有cookie document.cookie.split(";").forEach(c => { document.cookie = c.replace(/^ +/, "").replace(/=.*/, "=;expires=" + new Date().toUTCString() + ";path=/") }) })
同时确认登录成功后的回调逻辑,有没有正确将后端返回的token/凭证写入对应存储位置。
- 调整路由校验时序
你当前的路径校验只匹配到第一次符合/installations的状态就会通过,此时全局路由守卫可能还未完成鉴权校验,等守卫执行完成后发现没有有效凭证就会触发重定向。你可以给waitFor增加超时时间,额外等待一段时间确认路由状态稳定:
// 延长超时时间到3s,适配慢请求场景 await waitFor(() => expect(window.location.pathname).toBe('/installations'), { timeout: 3000 }) // 额外等待100ms确认不会再触发重定向 await new Promise(resolve => setTimeout(resolve, 100)) expect(window.location.pathname).toBe('/installations')
- 排查接口逻辑问题
- 如果调用真实后端接口:确认测试环境接口是否正常返回鉴权凭证,有没有跨域配置导致jsdom无法写入cookie
- 如果是mock接口:确认mock响应和真实后端逻辑一致,没有漏掉返回token、设置cookie的逻辑
- 排查严格模式影响
如果你的App外层包裹了React.StrictMode,会触发组件二次挂载,有可能第一次登录设置的鉴权状态在二次挂载时被重置,测试时可以暂时去掉StrictMode包裹确认是否是该问题导致。
内容的提问来源于stack exchange,提问作者Konflex
相关产品推荐
相关产品推荐

