У меня есть функция, которую я пытаюсь проверить. Эта функция является действием 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
не работает, что означает, что что-то, что я делаю с моими таймерами, должно быть виновником ... Однако, если я удаляю эти фиктивные таймеры, я все равно сталкиваюсь с тем жевопрос.
Что я неправильно понимаю при проверке обещания?