我有一个看起来像这样的异步函数:
const myMethod = async () => {
await Promise.all(
someIds.map((id) => {
someMethodThatReturnsPromise(id);
});
);
doSomethingElseAfterPromisesResolve();
};
此函数包含一个错误,因为它在其map函数中使用花括号但不返回每个promise。 Promise.all使用未定义的返回值并静默进入下一个语句,无需等待。可以通过使用括号而不是大括号,或通过包含显式返回语句来纠正此问题。
我的问题是,我该如何测试?我知道我可以使用Promise.resolve()或Promise.reject()来模拟promise的不同状态,并模拟内部方法的返回值,但这并不能真正解决问题。在完整的集成测试之外,如何通过测试来防止上述错误?
答案 0 :(得分:1)
嗯,问题不是Promise.all()
接受null,它不是。它接受的是[null]
或[undefined]
的数组(实际上是两个不同的东西)
正如我在评论中提到的,测试Promise.all()
不是我要做的,它是第三方代码,你应该自己测试,所以我认为对这些错误进行linter检查是一个非常优秀的解决方案
话虽如此,你有权得到你的意见,我只会指出实现你想要的东西的可能性。那就是:猴子补丁
您可以像这样覆盖Promise.all()
:
let originalAll = Promise.all;
Promise.all = (promises) => {
// you could check several other things
// but this covers what you wanted, right?
let isArrayWithBlanks = promises.includes(null) || promises.includes(undefined);
return isArrayWithBlanks
? Promise.reject("NO!")
: originalAll(promises);
};
现在,您可以轻松编写测试,因为您在整个项目中使用了这个猴子修补Promise.all
。您决定将该代码放在何处
希望这有帮助
答案 1 :(得分:0)
我会将someMethodThatReturnsPromise
和doSomethingElseAfterPromisesResolve
函数存根,并从两者中返回任何值。
然后确保someIds
有多个值。
您的断言可能是:
someIds
数组中的每个项目调用一次