Вот что я придумал:
const delay = duration => new Promise(resolve => setTimeout(resolve, duration));
test('should wait on otherFunction', async () => {
let resolve;
const mockPromise = new Promise((res) => {resolve = res;});
otherModule.otherFunction.mockReturnValue(mockPromise);
const resolution = jest.fn();
functionToBeTested(6).then(resolution);
expect(otherModule.otherFunction).toHaveBeenCalledWith(3);
await delay(0);
expect(resolution).not.toHaveBeenCalled();
resolve();
await delay(0);
expect(resolution).toHaveBeenCalled();
}
Итак, я высмеиваю другую функцию, чтобы вернуть обещание, которое начинается нерешенным, но я могу решить его по своему усмотрению во время теста.Затем я вызываю функцию, которую хочу протестировать, и вызываю ее, когда она завершится.
Затем я хочу заявить, что он не вызывал обратный вызов, но, поскольку разрешение обещания всегда асинхронно, мне нужно добавить тайм-аут 0, чтобы дать обещанию шанс разрешить.Я решил сделать это с заданной в обещании версией setTimeout.
И, наконец, я разрешаю mockPromise, делаю тайм-аут 0 (снова, чтобы убедиться, что обещание получит возможность вызывать его обратные вызовы), иутверждают, что теперь разрешение было вызвано .