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

Jest嵌套Promise测试问题:如何验证processFile被调用?

解决Jest测试Promise嵌套回调的问题

我来帮你梳理下问题,你的测试失败主要有几个关键问题,咱们一个个解决:

1. 报错根源:Mock的parseFile没有返回Promise

你当前的mockParser创建了Promise但没有把它返回出去,导致原代码调用Parser.parseFile().then()时,parseFile返回的是undefined,自然就会报错Cannot read property 'then' of undefined。

2. 修正Mock和测试逻辑的步骤

第一步:正确Mock Parser.parseFile

直接让它返回一个resolved状态的Promise,把你的测试数据传进去:

mockParser = jest.fn(() => Promise.resolve(ValidMockData));
CsvParser.parseFile = mockParser;

第二步:正确Mock validFile的返回值

你需要让validFile返回false(这样hasErrors就为false,才会触发processFile),注意jest.fn()的正确写法是传入一个函数:

wrapper.vm.validFile = jest.fn(() => false);

第三步:处理异步测试的等待逻辑

Jest需要知道什么时候异步操作完成,你可以用async/await来等待Promise执行完毕,或者返回Promise。这里用async/await更直观:

完整修正后的测试代码

describe("if the provided data is valid", () => {
  it('runs processFile', async () => { // 标记为async函数
    const mockProcessFile = jest.fn();
    // 正确mock parseFile,返回resolved的Promise
    const mockParser = jest.fn(() => Promise.resolve(ValidMockData));
    CsvParser.parseFile = mockParser;
    
    // 让validFile返回false,确保hasErrors为false
    wrapper.vm.validFile = jest.fn(() => false);
    wrapper.vm.processFile = mockProcessFile;

    // 调用要测试的方法
    await wrapper.vm.myMethod(); // 用await等待异步操作完成

    // 断言processFile被调用,可加上参数校验让测试更健壮
    expect(mockProcessFile).toHaveBeenCalledWith(ValidMockData);
  });
});

额外注意点

  • 如果你原来的测试里调用的是wrapper.vm.store(),要确保这个方法最终会触发myMethod,或者直接调用myMethod更直接(根据你的业务代码,应该是调用myMethod来触发逻辑)。
  • 用toHaveBeenCalledWith代替toBeCalled可以更精准地断言参数是否正确,让测试更健壮。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:33:49