【发布时间】:2020-12-27 00:10:53
【问题描述】:
我正在尝试在 jasmine 中测试一个包含 Promise.all 的函数(TypeScript,但我认为我在 JS 中也会遇到同样的问题)——我想确保我正在适当地处理拒绝:
function foo(): Promise<void> {
return Promise.all(promise1, promise2)
.catch(() => undefined)
.then(() => undefined);
}
function bar() {
foo().finally(makeBarHappen);
}
然后我的测试是这样的,我在其中模拟 foo 中的一个承诺失败:
it('test bar happens even when foo fails', async () => {
mocks.promise1.and.returnValue(Promise.reject('loremipsum'));
pressButtonThatTriggersBar();
await timeout(longEnoughTimeoutForBarToHappen);
expect(barHappened);
});
问题是,我从 Jasmine 收到“未处理的拒绝:抛出 loremipsum”错误 - 即使我相信我 正在 使用 foo 中的 catch() 处理拒绝?我不应该对 Promise.all 中的每个承诺都需要单独的捕获,不是吗?我手动测试了它,它确实捕捉到了拒绝并表现得很好,所以我不确定在 Jasmine 中测试它的最佳方法。谢谢!
【问题讨论】:
-
你的函数
bar没有返回一个承诺 - 这可能是问题,因为你的代码不知道它应该等待任何东西。 -
“我不应该为 Promise.all 中的每个承诺单独捕获,对吗?” 正确,你不需要。我不认为未处理的拒绝来自您发布的代码。
foo中的代码肯定会使用undefined将拒绝转换为履行。 -
@Kryten - 测试中的 cmets 表明测试正在等待。另外,这并不能解释 OP 报告的错误消息。但是 Nicole,你应该从 TypeScript 那里得到一个错误(不是你描述的运行时错误),因为
bar说它返回了一个承诺,但没有返回任何东西...... -
@Kryten 和 T.J.克劳德 - 哎呀,好接球。不幸的是,这个错误只出现在我的这个问题的伪代码中,而不是我的真实代码中。 bar() 实际上没有返回任何东西——我在上面编辑过。所以这不是问题。
-
@T.J.Crowder 谢谢!!!这就是我所缺少的洞察力——我的 Promise.reject 在被 Jasmine 吃掉并且测试失败之前甚至从来没有进入我的实际代码。我在 Jasmine 中找到了正确的方法——它们有一个 .throwError 函数。 :-)
标签: javascript typescript promise jasmine promise.all