Mock fetch时Jest测试结果异常但代码实际运行正常的问题排查
问题分析与解决方案
你遇到的核心问题是异步函数的测试没有正确处理Promise:createEvent是一个async函数,它执行后返回的是一个Promise对象,而不是直接返回布尔值true。你直接用expect(createEvent(newEvent)).toBe(true)断言时,实际是在比较Promise对象和true,自然会得到不匹配的结果(控制台里的Received: {}是Promise对象的简略表现形式)。
修正测试代码的两种有效方式
方式一:使用async/await(推荐,代码更直观)
把测试函数声明为async,然后等待createEvent执行完成后再做断言:
global.fetch = jest.fn(() => Promise.resolve({ json: () => Promise.resolve({ success: true }), })); it('returns proper value', async () => { // 等待异步函数执行完成拿到结果 const result = await createEvent(newEvent); expect(result).toBe(true); });
方式二:返回Promise并通过.then断言
如果更习惯Promise链式调用的写法,可以让测试函数返回Promise,在回调里完成断言:
global.fetch = jest.fn(() => Promise.resolve({ json: () => Promise.resolve({ success: true }), })); it('returns proper value', () => { // 返回Promise让Jest等待其完成 return createEvent(newEvent).then(result => { expect(result).toBe(true); }); });
额外测试场景补充
如果需要覆盖createEvent的其他返回情况,可以调整fetch的mock:
- 测试返回
false的场景:让mock返回{success: false}的响应
global.fetch = jest.fn(() => Promise.resolve({ json: () => Promise.resolve({ success: false }), }));
- 测试返回
null的出错场景:让fetch模拟请求失败
global.fetch = jest.fn(() => Promise.reject(new Error("Fetch failed")));
内容的提问来源于stack exchange,提问作者YoungZaphod
相关产品推荐
相关产品推荐

