Тестирование Promise.all - PullRequest
0 голосов
/ 24 мая 2018

У меня есть асинхронная функция, которая выглядит примерно так:

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

Эта функция содержит ошибку, потому что она использует фигурные скобки в своей функции карты, но не возвращает каждое обещание.Promise.all использует неопределенное возвращаемое значение и молча переходит к следующему оператору без ожидания.Проблема может быть исправлена ​​с помощью скобок вместо фигурных скобок или путем включения явного оператора возврата.

Мой вопрос: как я могу это проверить?Я знаю, что могу использовать Promise.resolve () или Promise.reject (), чтобы имитировать различные состояния обещания и высмеивать возвращаемые значения внутреннего метода, но это не решает проблему.Вне полного тестирования интеграции, как я могу предотвратить вышеуказанную ошибку с тестом?

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Ну, проблема не в том, что Promise.all() принимает ноль, это не так.Он принимает массивы типа [null] или [undefined] (на самом деле это две разные вещи)

Как я уже упоминал в моих комментариях, тестирование Promise.all() - это не то, что я хотел бы сделать, этосторонний код, вы должны тестировать свой собственный, поэтому я думаю, что проверка на наличие ошибок для таких ошибок является гораздо лучшим решением

При этом вы имеете право на свое мнение, я просто укажу навозможность достижения того, что вы хотите.То есть: исправление обезьяны

Вы можете перезаписать 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 на протяжении всего вашего проекта.Вы сами решаете, где разместить этот код

Надеюсь, это поможет

0 голосов
/ 24 мая 2018

Я бы поставил в тупик обе функции someMethodThatReturnsPromise и doSomethingElseAfterPromisesResolve, вернув любое значение из обоих.

Затем убедитесь, что someIds имеет несколько значений.

Ваши утверждения могут быть:

  1. someMethodThatReturnsPromise вызывается один раз для каждого элемента в массиве someIds
  2. doSomethingElseAfterPromisesResolve называется
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...