You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jest try-catch单元测试失败问题求助

问题分析与修复方案

你的错误测试用例存在核心逻辑错误,同时没有正确mock内部依赖的exportData函数,导致无法触发错误场景。以下是具体问题和修复步骤:

核心问题

  1. 错误测试逻辑颠倒:你先执行了createJobTrasferSetArray,再试图给结果添加mockRejectedValue,这完全无效——result是函数执行后的返回值,不是可mock的函数,根本无法触发catch块。
  2. 未正确mock依赖:createJobTrasferSetArray内部依赖exportData(),但你没有正确mock这个函数的返回值或错误,无法模拟出错场景。
  3. 原代码小问题:存在拼写错误(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:27:23