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

如何在Vitest中同时对fetch进行多模拟(不拆分函数)

在Vitest中模拟同一函数内的两次不同Fetch请求

你可以通过Vitest提供的两种方式,在不拆分setupAccessToken的前提下,分别模拟两次fetch请求的响应:

方式一:按调用顺序返回不同响应

适合明确知道两次fetch调用顺序的场景,用mockReturnValueOnce为每次调用依次设置返回值:

// 定义你的两个Mock数据
const accessTokenMock_pass = { /* 成功状态的返回数据 */ };
const accessTokenMock_fail = { /* 失败状态的返回数据 */ };

// 模拟fetch函数,依次返回预设响应
global.fetch = vi.fn()
  // 第一次调用fetch返回成功响应
  .mockReturnValueOnce(Promise.resolve({
    ok: true,
    text: () => Promise.resolve(JSON.stringify(accessTokenMock_pass))
  }))
  // 第二次调用fetch返回失败响应
  .mockReturnValueOnce(Promise.resolve({
    ok: true,
    text: () => Promise.resolve(JSON.stringify(accessTokenMock_fail))
  })) as Mock;

// 执行目标函数
await setupAccessToken();

// 可选:验证fetch被调用了两次
expect(global.fetch).toHaveBeenCalledTimes(2);

方式二:按请求参数(如URL)区分响应

如果两次fetch请求的目标URL不同,用mockImplementation根据请求参数返回对应响应,这种方式不依赖调用顺序,更精准:

// 定义你的两个Mock数据
const accessTokenMock_pass = { /* 成功状态的返回数据 */ };
const accessTokenMock_fail = { /* 失败状态的返回数据 */ };

// 根据请求URL返回不同响应
global.fetch = vi.fn((url) => {
  if (url === '/your-first-api-endpoint') {
    return Promise.resolve({
      ok: true,
      text: () => Promise.resolve(JSON.stringify(accessTokenMock_pass))
    });
  } else if (url === '/your-second-api-endpoint') {
    return Promise.resolve({
      ok: true,
      text: () => Promise.resolve(JSON.stringify(accessTokenMock_fail))
    });
  }
  // 可选:默认返回一个空响应
  return Promise.resolve({ ok: false, text: () => Promise.resolve('') });
}) as Mock;

// 执行目标函数
await setupAccessToken();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:17:26