You need to enable JavaScript to run this app. 如何使用Jest测试fetch请求实现100%代码覆盖率?是否值得测试?
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Jest测试fetch请求实现100%代码覆盖率?是否值得测试?

这类请求封装函数完全值得测试

这类属于业务底层通用工具函数,一旦逻辑出错(比如请求方法传错、参数序列化逻辑错误、Header缺漏),所有依赖它的上层业务逻辑都会受影响,且测试成本极低,性价比很高。

用Jest实现100%测试覆盖率的步骤

你只需要Mock全局的fetch方法,覆盖所有逻辑分支即可,具体实现如下:

1. 编写测试文件

假设你的原函数存放在api.js中,测试文件api.test.js内容如下:

import { fetchGetCard } from './api';

// 每次测试前重置mock的fetch
beforeEach(() => {
  global.fetch = jest.fn();
});

// 每次测试后清空mock调用记录
afterEach(() => {
  jest.clearAllMocks();
});

test('调用时传入正确的请求参数且正常返回结果', async () => {
  const testLang = 'zh';
  const testWord = '测试';
  const mockReturnContent = '卡片测试内容';

  // 模拟正常请求返回
  fetch.mockResolvedValueOnce({
    text: jest.fn().mockResolvedValueOnce(mockReturnContent)
  });

  const result = await fetchGetCard(testLang, testWord);

  // 断言fetch调用符合预期
  expect(fetch).toHaveBeenCalledTimes(1);
  expect(fetch).toHaveBeenCalledWith('/getCard', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ lang: testLang, word: testWord })
  });
  // 断言返回结果符合预期
  expect(result).toBe(mockReturnContent);
});

test('请求异常时正常抛出错误', async () => {
  const mockError = new Error('网络请求失败');
  // 模拟请求异常
  fetch.mockRejectedValueOnce(mockError);

  await expect(fetchGetCard('en', 'test')).rejects.toThrow(mockError);
});

2. 覆盖率验证

运行上述测试用例后,所有代码行、分支、函数、语句都会被覆盖,即可达到100%测试覆盖率:

  • 正常请求用例覆盖了函数入参、fetch配置、response.text()的逻辑
  • 异常请求用例覆盖了请求失败的分支逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 07:09:00