Предварительные фальшивые таймеры на Promise и прохождение значения разрешения - PullRequest
2 голосов
/ 11 марта 2019

У меня есть фиктивная функция, которая подделывает запрос с помощью fetch. Я хочу, чтобы эта фиктивная функция вызывалась с задержкой, чтобы проверить, было ли запущено свойство timeout в тестируемой функции или нет. В настоящее время я откладываю обещание так:

   jest.useFakeTimers();

(request as jest.Mock).mockImplementationOnce(() =>
    Promise.resolve(response1).then(() => jest.advanceTimersByTime(3000))
);

В тестируемой мной функции конфигурация задается как состояние избыточности, если в конфигурации задано свойство тайм-аута, setTimeOut запускается, если функция запроса (которую мы высмеиваем в тестовом костюме занимает больше времени, чем время ожидания cb из setTimeOut должен сработать, а функция сбоев / ошибок должна сработать). Кусок кода выглядит так:

` return new Promise((resolve: () => void) => {
            const timeout = config.timeout || globalConfig.timeout;
            let abortTimeout: any;
            let aborted = false;
            if (timeout) {
                abortTimeout = setTimeout(
                    () => {
                        const error = new Error('Timeout');
                        console.log(timeout);
                        dispatch(apiDataFail(requestKey, error));
                        onError(error);
                        aborted = true;
                    },
                    timeout`enter code here`
                );
            }
            requestFunction(formatUrl(config.url, params), requestProperties).then(
                ({ response, body: responseBody }: HandledResponse) => {
                    if (aborted) {
                        return;
                    }

Тест выглядит так:

test('The function resolves with a timeout argument', async (done) => {
    state = { apiData: getState('getData', true, {}, 'ready', 'GET', -1, undefined, undefined, 2900) };
    const resolves = await (performApiRequest('getData', {}, { data: 'json' })(dispatch, () => store.getState()))
    expect(resolves).toBeUndefined()
    const error = new Error('Timeout');
    const requestKey = getRequestKey('getData');
    expect(dispatch).toHaveBeenCalledWith(apiDataFail(requestKey, error));
    done();
});

тайм-аут срабатывает правильно, но в тесте появляется ошибка: Ошибка типа: невозможно прочитать свойство 'response' из неопределенного

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