首页 > 解决方案 > 在 jasmine 测试中处理 Promise.all 中的拒绝

问题描述

我正在尝试在 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 中测试它的最佳方法。谢谢!

标签: javascripttypescriptpromisejasminepromise.all

解决方案


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

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

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


推荐阅读