【问题标题】:Handling reject in Promise.all in jasmine tests在 jasmine 测试中处理 Promise.all 中的拒绝
【发布时间】: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


【解决方案1】:

看起来测试 promise1 失败的正确方法是:

mocks.promise1.and.throwError('');

Promise.reject() 在被我的实际错误处理代码捕获之前就被 Jasmine 捕获了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-13
    • 2018-02-25
    • 1970-01-01
    • 2015-10-21
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    相关资源
    最近更新 更多