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
相关产品推荐
相关产品推荐

