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

使用Jest测试App组件时登录成功后为何跳转回登录页?

登录流程测试重定向问题排查修复方案
  • 修复异步点击逻辑
    userEvent.click为异步方法,你当前将其包裹在同步act()中未等待执行完成,会导致登录请求、鉴权状态更新逻辑还未执行完就提前通过了路径校验,后续鉴权逻辑生效后检测不到有效凭证就触发重定向。将点击登录按钮的代码替换为以下内容即可,userEvent v14+ 会自动处理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')
  • 排查接口逻辑问题
    1. 如果调用真实后端接口:确认测试环境接口是否正常返回鉴权凭证,有没有跨域配置导致jsdom无法写入cookie
    2. 如果是mock接口:确认mock响应和真实后端逻辑一致,没有漏掉返回token、设置cookie的逻辑
  • 排查严格模式影响
    如果你的App外层包裹了React.StrictMode,会触发组件二次挂载,有可能第一次登录设置的鉴权状态在二次挂载时被重置,测试时可以暂时去掉StrictMode包裹确认是否是该问题导致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:15:01