如何使用Jest编写单元测试覆盖JavaScript函数的Try Catch异常分支(解决代码覆盖率未达标问题)
解决Jest测试中Catch块未覆盖的问题
要覆盖createJobTrasferSetPayloadOutput函数的catch分支,我们只需要模拟fs.promises.writeFile抛出错误,让代码进入异常处理逻辑即可。下面是具体的实现步骤和完整测试代码:
步骤说明
- 使用Jest的
mockRejectedValue方法,让mock的writeFile返回一个被拒绝的Promise(模拟文件写入失败的场景)。 - 新增一个独立的测试用例,专门验证异常分支的行为:断言函数返回的是预期的错误,同时确认
writeFile确实被调用过。
完整的测试代码
const empJobTransferSrvc = require('../../../libs/employeeJobTransferSet/employeeJobTransferServiceLive'); const fs = require('fs'); jest.mock('fs', () => ({ promises: { writeFile: jest.fn(), }, })); // 定义测试用的payload数据 const jobTransferSetPayload = [{ id: 1, position: 'Developer' }]; describe('createJobTrasferSetPayloadOutput', () => { afterEach(() => { jest.resetModules(); jest.clearAllMocks(); }); it('should create and write to the file successfully', async () => { const result = await empJobTransferSrvc.createJobTrasferSetPayloadOutput(jobTransferSetPayload); expect(JSON.parse(result)[0]).toEqual(jobTransferSetPayload[0]); expect(result).not.toBeNull(); // 额外断言:确认writeFile被调用时的参数正确 expect(fs.promises.writeFile).toHaveBeenCalledWith( './output/jobTransferSetPayload.json', JSON.stringify(jobTransferSetPayload, null, 4), { overwrite: false } ); }); it('should return error when file write fails', async () => { // 模拟writeFile抛出错误 const testError = new Error('Failed to write file'); fs.promises.writeFile.mockRejectedValue(testError); const result = await empJobTransferSrvc.createJobTrasferSetPayloadOutput(jobTransferSetPayload); // 断言返回的是我们模拟的错误 expect(result).toEqual(testError); // 确认writeFile确实被调用了 expect(fs.promises.writeFile).toHaveBeenCalled(); }); });
关键细节
- 我们给测试套件重命名为更贴合函数名的
createJobTrasferSetPayloadOutput,比原来的命名更清晰。 - 在成功分支的测试里新增了对
writeFile调用参数的断言,让测试逻辑更健壮。 - 异常分支测试中,通过
mockRejectedValue模拟写入失败,然后验证函数返回的错误是否符合预期。
这样修改后,你的代码覆盖率应该就能达标了,catch块里的return err;语句会被执行到。
内容的提问来源于stack exchange,提问作者R.Almoued
相关产品推荐
相关产品推荐

