Jest try-catch单元测试失败问题求助
问题分析与修复方案
你的错误测试用例存在核心逻辑错误,同时没有正确mock内部依赖的exportData函数,导致无法触发错误场景。以下是具体问题和修复步骤:
核心问题
- 错误测试逻辑颠倒:你先执行了
createJobTrasferSetArray,再试图给结果添加mockRejectedValue,这完全无效——result是函数执行后的返回值,不是可mock的函数,根本无法触发catch块。 - 未正确mock依赖:
createJobTrasferSetArray内部依赖exportData(),但你没有正确mock这个函数的返回值或错误,无法模拟出错场景。 - 原代码小问题:存在拼写错误(
Coldn't→Couldn't,Trasfer/Transfer拼写不一致),且async函数内无await操作(可移除async,但不影响功能)。
修复后的测试代码
首先确保exportMyData.js中exportData和createJobTrasferSetArray都是导出的函数,然后修改测试文件:
const { createJobTrasferSetArray } = require('./exportMyData'); const { exportData } = require('./exportMyData'); // Mock同模块的exportData函数 jest.mock('./exportMyData', () => { const originalModule = jest.requireActual('./exportMyData'); return { ...originalModule, exportData: jest.fn(), }; }); describe('Read data from Excel and create formatted json output', () => { // 保留已通过的测试 it('convert read data from Excel to an array', async () => { exportData.mockReturnValue(jobTrasfarSetRaw); const result = await createJobTrasferSetArray(); expect(result[0].coworkerID).toEqual(jobTransferSetArray[0].coworkerID); expect(result[0].jobPath).toEqual(jobTransferSetArray[0].jobPath); expect(result).not.toBeNull(); }); // 测试:处理exportData返回非数组导致的错误 it('should catch error when processing invalid data', async () => { // 模拟exportData返回null,调用forEach时会抛出TypeError exportData.mockReturnValue(null); // 用Jest的rejects语法直接断言错误 await expect(createJobTrasferSetArray()).rejects.toThrow(TypeError); await expect(createJobTrasferSetArray()).rejects.toThrow("Cannot read properties of null (reading 'forEach')"); }); // 测试:处理exportData本身抛出的错误 it('should handle error thrown by exportData', async () => { const testError = new Error('something went wrong'); exportData.mockImplementation(() => { throw testError; }); const result = await createJobTrasferSetArray(); // 原函数catch块会返回错误对象 expect(result).toBe(testError); // 断言错误日志被正确打印 expect(console.error).toHaveBeenCalledWith(expect.stringContaining("Couldn't create jobTransferSet Array")); }); });
额外说明
- 如果要模拟
element.JobPath为undefined导致的split错误,只需让exportData返回包含JobPath: undefined的元素数组即可,同样会触发catch块。 - 原函数的try/catch可以捕获同步错误,因为forEach是同步执行的,回调中的错误会冒泡到外层try块。
内容的提问来源于stack exchange,提问作者R.Almoued
相关产品推荐
相关产品推荐

