Как проверить обратный вызов Promise внутри не-обещающей функции? - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть функция, внутри которой вызывается функция обещания.Но само по себе не возвращает обещание.

const toBeTestedFunc = () => {
    const promise = promiseFunc()
                   .then(() => {})
                   .catch((error) => { errorHandler() });
}

Как проверить, вызывается ли errorHanlder()?Я написал что-то вроде ниже, но это не удалось, потому что тест завершен до выполнения обратного вызова.

const test = () => {
    toBeTestedFunc();
    expect(errorHandler).toBeCalled();
}

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

Если нет способа ожидания асинхронной операции, единственное, что я могу предложить, - это использовать https://github.com/TheBrainFamily/wait-for-expect., что позволит вам дождаться, пока ваше утверждение пройдет

0 голосов
/ 03 октября 2018

Issue

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

Решение

Дайте Promise обратным вызовам aшанс запустить перед вызовом expect.

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

Для ситуаций, когда этоневозможно, вы можете разрешить выполнение обратных вызовов Promise, сделав тестовую функцию async и вызвав await для разрешенного Promise.

Это, по существу, ставит в очередь оставшуюся часть теста в конце PromiseJobs очередь за Promise обратными вызовами.

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


Вот рабочий пример:

const errorHandler = jest.fn();
const promiseFunc = () => Promise.reject();

const toBeTestedFunc = () => {
  const promise = promiseFunc()
    .then(() => { })
    .catch((error) => { errorHandler() });
}

test('errorHandler called', async () => {   // make the test function async
  toBeTestedFunc();
  await Promise.resolve().then();   // allow the callbacks queued in PromiseJobs to run
  expect(errorHandler).toBeCalled();   // SUCCESS
});
0 голосов
/ 19 сентября 2018

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

  • (рекомендуется). Верните обещание в toBeTestedFunc, а затем протестируйте так:

    const test = () => {
           toBeTestedFunc().then(() => {
               expect(errorHandler).toBeCalled();
           });    
    }

    Вот шутка документация для тестирования асинхронных функций.

  • (хакерское решение) Подчеркните возвращаемое значение promiseFunc, чтобы оно было похожим на Promise.Таким образом, этот тест будет ожидать обратного вызова (errorHandler) для выполнения.Пример здесь .

Спасибо за помощь @Jared Smith и @ mpm :)

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