Разрешение обещания внутри setTimeout дает ошибку времени ожидания - PullRequest
1 голос
/ 16 октября 2019

У меня есть функция, которую я пытаюсь проверить. Эта функция является действием Vuex, но это не должно иметь никакого отношения к вопросу или решению, поэтому я переписал функцию как можно проще. Функция возвращает обещание, которое в одном случае разрешается внутри setTimeout:

async myFunction(context) {
    return new Promise(async (resolve, reject) => {
      try {
        const data = { some: 'data' };
        await axios.post(data);

        setTimeout(() => {
          context.commit('anotherFunction');

          setTimeout(() => {
            resetSomeState();
            resolve();
          }, 1000);
        }, 1000);
      } catch (e) {
        logError(e);
        reject(e);
      }
    });
  },

мой тест выглядит так:

it('should call other function', async () => {
        jest.useFakeTimers();
        axios.post.resolve();
        await myFunction(context);
        jest.runAllTimers();
        expect(context.commit).toBeCalledWith('anotherFunction');
      });

Но я получаю ошибку

Асинхронный обратный вызов не был вызван в течение тайм-аута 5000 мс, указанного в jest.setTimeout.

Если я удаляю ключевое слово await на axios.post, это работает, но для меня это должно иметьне влияет на реальный тест?

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

Что я неправильно понимаю при проверке обещания?

1 Ответ

0 голосов
/ 16 октября 2019

У меня есть ваш проблемный друг.

Вы издеваетесь над таймерами, это означает, что реальный таймер никогда не будет работать, пока вы не вызовете jest.runAllTimers или jest.runOnlyPendingTimers Но ключевое слово await в вашем test example будет ждать дооно разрешается, но на самом деле оно никогда не разрешится.

Итак, для того, чтобы проверить, что вы можете сделать, нужно переписать test example следующим образом:

it('should call other function', async () => {
  jest.useFakeTimers()
  axios.post.resolve()
  myFunction(context)
  jest.runAllTimers()
  expect(context.commit).toBeCalledWith('anotherFunction')
})

Или, если вы хотите проверитьобещание выполнено или не переписано, как это

it('should call other function', async () => {
  jest.useFakeTimers()
  axios.post.resolve()
  const promise = myFunction(context)
  jest.runAllTimers()
  expect(context.commit).toBeCalledWith('anotherFunction')
  expect(promise).resolves.toBeUndefined()
})
...