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

Vitest迁移后MSW runtime request handler无法正常工作求助

解决Vitest中MSW动态请求处理器不生效的问题

核心问题原因

Vitest与Jest的测试隔离机制存在差异,若未正确重置MSW服务器状态,会导致测试间的请求处理器残留,新添加的动态处理器无法优先匹配,最终返回默认处理器的响应。

具体解决方案

1. 配置全局测试钩子,确保测试间状态隔离

在Vitest的全局配置文件(如vitest.setup.js)中添加MSW的初始化与清理逻辑,每个测试后重置服务器处理器:

import { server } from './mocks/server';

// 测试前启动MSW服务器
beforeAll(() => server.listen({ onUnhandledRequest: 'warn' }));
// 每个测试结束后重置处理器到初始状态(即setupServer时的默认处理器)
afterEach(() => server.resetHandlers());
// 所有测试结束后关闭服务器
afterAll(() => server.close());

2. 确保动态处理器优先匹配

MSW的server.use()会将新处理器添加到处理器队列的头部,因此更具体的端点处理器会优先于默认的通配符处理器匹配。但需保证每个测试前已重置状态,避免之前测试的处理器干扰当前测试。

3. 验证处理器添加状态(可选排查步骤)

若问题仍存在,可在测试中打印当前服务器的处理器列表,确认自定义处理器是否已正确添加:

it('should call the correct endpoint and return the API response', async () => {
  mockApiResponse({
    endpoint: `/companies/1/api-key`,
    method: RESTMethods.POST,
    response: MOCK_CREATE_COMPANY_API_KEY_API_RESPONSE,
    statusCode: 201,
  });

  // 打印当前处理器,确认自定义POST处理器存在
  console.log(server.listHandlers());

  const { result, waitFor } = renderHook(() => useCreateCompanyApiKey(1));
  result.current.mutate();
  await waitFor(() => result.current.isSuccess);
  expect(result.current.data).toEqual(MOCK_CREATE_COMPANY_API_KEY_API_RESPONSE);
});

4. 检查React Query的缓存(可选)

若使用React Query,需确保测试中缓存被正确清除,避免之前测试的缓存数据影响当前测试结果:

import { QueryClient, QueryClientProvider } from '@tanstack/react-query';

// 在测试中创建新的QueryClient,隔离缓存
const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      cacheTime: 0,
    },
  },
});

// 渲染钩子时包裹Provider
const { result, waitFor } = renderHook(() => useCreateCompanyApiKey(1), {
  wrapper: ({ children }) => (
    <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
  ),
});

总结

核心是通过server.resetHandlers()确保每个测试的MSW状态干净,动态添加的处理器能优先匹配请求。同时配合React Query的缓存隔离,即可解决Vitest环境下的响应不匹配问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 23:50:44