测试Promise.all

时间:2018-05-23 21:28:03

标签: javascript ecmascript-6

我有一个看起来像这样的异步函数:

const myMethod = async () => {
  await Promise.all(
    someIds.map((id) => {
      someMethodThatReturnsPromise(id);
    }); 
  );
  doSomethingElseAfterPromisesResolve();
};

此函数包含一个错误,因为它在其map函数中使用花括号但不返回每个promise。 Promise.all使用未定义的返回值并静默进入下一个语句,无需等待。可以通过使用括号而不是大括号,或通过包含显式返回语句来纠正此问题。

我的问题是,我该如何测试?我知道我可以使用Promise.resolve()或Promise.reject()来模拟promise的不同状态,并模拟内部方法的返回值,但这并不能真正解决问题。在完整的集成测试之外,如何通过测试来防止上述错误?

2 个答案:

答案 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)

我会将someMethodThatReturnsPromisedoSomethingElseAfterPromisesResolve函数存根,并从两者中返回任何值。

然后确保someIds有多个值。

您的断言可能是:

  1. someMethodThatReturnsPromise为someIds数组中的每个项目调用一次
  2. doSomethingElseAfterPromisesResolve被称为