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

Jest搭配MSW与RTK Query执行测试时出现奇怪报错如何解决?

排查思路
  • 优先检查测试间的全局状态污染:你单独跑失败用例正常、并发跑异常,90%的原因是第一个成功登录的测试将认证态(token等)写入了localStorage/sessionStorage等全局存储,第二个测试初始化时残留的认证态导致App直接判定用户已登录,跳转到客户页触发/customers接口请求,和后续的登录失败逻辑产生交叉冲突。
  • 检查成功测试的异步等待完整性:你当前的成功登录测试仅验证了页面标题渲染,未等待/customers接口请求完成就结束测试,未完成的请求会在第二个测试运行周期内返回,触发非预期的状态更新。
  • 确认状态更新的防御逻辑:你当前的customersSlice中调用upsertMany前没有校验payload合法性,一旦接收到payload为null/undefined的action就会直接抛出错误。
解决方案
  1. 清理测试间全局状态污染
    在setupTests.ts的afterEach钩子中添加全局存储清理逻辑,清除上一个测试遗留的认证态:
afterEach(() => {
  server.resetHandlers();
  window.localStorage.clear();
  window.sessionStorage.clear();
});
  1. 补全成功测试的异步等待逻辑
    在成功登录测试的末尾添加等待客户列表请求完成的逻辑,确保测试结束前所有异步操作都已处理完毕:
// 你的现有逻辑:验证客户页标题存在
const accountsPage = screen.getByRole("heading", { name: /accounts/i });
expect(accountsPage).toBeInTheDocument();

// 新增:等待客户列表渲染,确认/customers请求已完成
await waitFor(() => expect(screen.getByText(/客户列表里的固定展示文本/i)).toBeInTheDocument());
  1. 添加状态更新的防御判断
    修改customersSlice中的upsertMany调用逻辑,增加payload合法性校验,避免非预期报错:
(state, action) => {
  const { payload } = action;
  // 仅payload为有效值时执行更新
  if (Array.isArray(payload) || (payload && typeof payload === 'object')) {
    adapter.upsertMany(state, payload);
  }
}

内容的提问来源于stack exchange,提问作者Chris van der Merwe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:57:03