如何在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
相关产品推荐
相关产品推荐

