使用Jest测试Promise reject代码路径时测试失败如何解决
问题原因
你在第二个测试中await的是未挂载拒绝处理的原始Promise实例p,而非run()方法返回的、已经通过链式调用挂载了catch处理的新Promise。当你调用rejecter()将p标记为拒绝状态后,await p会因为没有对应的拒绝捕获逻辑直接抛出未捕获错误,也就是你看到的thrown: undefined报错。
你在run()中为p挂载的catch只会作用于链式调用返回的新Promise,不会改变原始p本身没有拒绝处理的特性。
修复方案
将测试中等待的对象替换为run()返回的带捕获逻辑的Promise即可,修改后的完整测试代码如下:
// 第一个测试同步修正,避免潜在时序问题 test("it should call with resolved when p resolves", async () => { const runPromise = run(); resolver(); await runPromise; expect(f).toHaveBeenCalledWith("resolved"); }); test("it should call with rejected when p rejects", async () => { const runPromise = run(); rejecter(); await runPromise; expect(f).toHaveBeenCalledWith("rejected"); });
修改后两个测试都会正常通过,f的调用断言也能正确命中。
内容的提问来源于stack exchange,提问作者OliverRadini
相关产品推荐
相关产品推荐

