Как мне не пройти тест в Jest, когда происходит непринятое отклонение обещания? - PullRequest
0 голосов
/ 01 мая 2018

Я работаю над добавлением тестового покрытия в проект Node, над которым я работаю, используя Jest. Код, который я тестирую, выдает ошибки в обещаниях, в результате чего сообщение UnhandledPromiseRejectionWarning регистрируется на консоли.

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

В документации по Node я обнаружил, что вы можете перехватить эти предупреждения и обработать их ...

process.on('unhandledRejection', (error) => {
  throw error; // Or whatever you like...
});

Так что, кажется, было бы довольно просто добавить этот код в мои тестовые случаи. В конце концов, Error, брошенный в тесте , должен привести к сбою теста ...

describe('...', () => {
  it('...', () => {
    process.on('uncaughtRejection', (error) => {
      throw error;
    });

    // the rest of my test goes here
  });
});

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

Выдача ошибки за пределы обработчика uncaughtRejection работает, как и ожидалось: Jest регистрирует выданную ошибку и не проходит тест, но не вылетает. (т. е. наблюдатель продолжает наблюдать и запускать тесты)

Ответы [ 2 ]

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

Не уверен, поможет ли это, но вы также можете заявить об отказе от обещания как таковом

index.js

module.exports = () => {
  return Promise.reject('it didnt work');
}

index.spec.js

const thing = require('../src/index');

describe('rejected promise', () => {
  it('should reject with a reason', ()=> {

    return expect(thing()).rejects.toEqual('it didnt work');
   });
});
0 голосов
/ 01 мая 2018

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

Например ... Представьте, что я тестирую эту функцию:

const myFunction = () => {
    return doSomethingWithAPromise()
        .then(() => {
            console.log('no problems!');
            return true;
        });
};

Тест будет выглядеть примерно так:

describe('...', () => {
    it('...', () => {
        return myFunction()
            .then((value) => {
                expect(value).toBe(true);
            });
    });
});

Который прекрасно работает. Что произойдет, если обещание будет отклонено? В моем тесте отклоненное обещание передается обратно в Jest (поскольку я возвращаю результат вызова функции), и Jest может сообщить об этом.

Если вместо этого ваша функция не возвращает обещание, вам, возможно, придется сделать что-то вроде этого:

const myOtherFunction = () => {
    doSomethingWithAPromise()
        .then(() => {
            console.log('no problems!');
            return true;
        })
        .catch((err) => {
             // throw the caught error here
             throw err;
        });
};

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...