Тестирование функции полностью с использованием заглушек - PullRequest
0 голосов
/ 07 февраля 2019

Я пишу тесты последние пару недель.На моем рабочем месте мы используем Mocha в качестве нашего организатора испытаний и Chai в качестве библиотеки утверждений.Я также использую Sinon для создания заглушек, и меня постоянно что-то беспокоит.Я написал тесты для пары функций, в которых я заглушаю каждую зависимость в функции, и в худшем случае я даже не рассматриваю аргументы, которые принимает функция, которую я тестирую.Позвольте мне привести пример

module.exports = {
  "someFunc": (arg1, arg2) => {
    return new Promise((resolve, reject) => {
      Promise.all(arg1).then(data => {
        let someArray = ourHelperLib.toArray(data);
        let someObj = ourHelperLib.toObject(arg2);
          if(someArray.length == 0){
            reject("error");
          }else{
            resolve({
              "array": someArray,
              "object": someObj
            });
          }
        }).catch(err => {
            reject(err);
        });
    });
  },
}
  1. Теперь, когда я пишу тесты для этой функции, у меня есть случай, когда я заглушаю Promise.all(), чтобы выдать ошибку.
  2. Для моего второго теста, Я заглушаю Promise.all(), чтобы вернуть ложное положительное значение, и заглушку ourHelperLib.toArray(), чтобы выдать ошибку и проверить, обрабатывает ли функция это или нет.
  3. Для третьего теста я заглушаю Promise.all(), ourHelperLib.toArray() иourHelperLib.toObject() для возврата ложных срабатываний, а затем проверки выходных данных для разрешенного обещания со значением, являющимся результатом операций.

Из определения функции ясно, что оба аргумента, переданные вфункции передаются непосредственно зависимостям, которые я заглушаю, поэтому я могу полностью игнорировать эти значения, вот что я имею в виду

const stubOurHelperLibToThrowError = argFromCaller => {
    throw new Error("This is an error");
}

Поскольку я не обрабатываю аргумент, переданный моей функции-заглушке, я совсем нетестирование функции на основе данных, которые передаются в нее.Я просто проверяю логическую структуру функции someFunc().

Это хорошая практика?Я не нашел много убедительных ответов, и, поскольку я отвечаю за введение руководств по написанию модульных тестов, где я сейчас работаю, это то, что я считаю крайне важным.

Peace!

1 Ответ

0 голосов
/ 08 февраля 2019

Вы можете передавать обещания своей функции без необходимости заглушать что-либо для большей части того, что вы описываете.


У меня есть случай, когда я заглушаю Promise.all ()ошибка

Вместо заглушки Promise.all, просто передайте массив с отклоненным Promise вашей функции:

someFunc([Promise.reject(new Error('fail'))], null)

..., что приведет к Promise.allперейти в catch и отклонить с ошибкой.


Я заглушаю Promise.all (), чтобы вернуть ложное положительное значение, и заглушку ourHelperLib.toArray (), чтобы выдать ошибку и проверитьесли функция обрабатывает это или нет

Опять же, вместо заглушки Promise.all, просто передайте массив с разрешенным Promise:

someFunc([Promise.resolve('a value')], null)

Вы можете либо заглушку ourHelperLib.toArray для выдачи ошибки или разрешения вашего массива Promise на то, что, как вы знаете, вызовет ourHelperLib.toArray.


Для третьего теста я заглушаю Promise.all (),ourHelperLib.toArray () и ourHelperLib.toObject () возвращают ложные срабатывания, а затем проверяют выходные данные на результатlved обещание со значением, которое является результатом операций.

Stubbing ourHelperLib.toArray и ourHelperLib.toObject необязательно.Если они не являются вычислительно дорогими (например, если они выполняют сетевые вызовы), то обычно имеет смысл называть их как обычно.

Вы можете передать данные, которые вы хотите дать ourHelperLib.toArray, в массиве resolved Promise s, и просто передайте значение, которое вы хотите отправить, ourHelperLib.toObject в качестве второго аргумента:

someFunc([
  Promise.resolve('value 1 for ourHelperLib.toArray'),
  Promise.resolve('value 2 for ourHelperLib.toArray')
], 'value for ourHelperLib.toObject')

... и убедитесь, что результирующее Promise разрешается в ожидаемое значение.


Как правило, рекомендуется придерживаться теста черного ящика.

Эта функция, по-видимому, не имеет побочных эффектов и просто возвращает Promise, который разрешается в результате.на основе переданных параметров.

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

...