Res.Redirect не вызывается в Jest Test

я использую node-express и пытаюсь проверить перенаправление, когда вызов из API успешен. Я получаю сообщение об ошибке - Expected mock function to have been called, but it was not called.

вот моя функция:

export function globalAuthHandler (req, res, next) {
    const global_signin_url = config.get('url');
    if (global_signin_url) {
        console.log(global_signin_url);
        fetch(global_signin_url)
            .then((response) => response.json())
            .then((response) => {
                console.log('Response', response);
                if (response.data) {
                    console.log('Success!!!');
                    res.redirect('/signIn');
                } else {
                    console.log('going here 1' + response);
                    res.redirect('/session-expired');
                    throw Error(response.statusText);
                }
            })
            .catch((error) => {
                console.log('going global here 2 ' + error);
                next(error);
            });
    } else {
        console.log('going here 3');
        res.redirect('/session-expired');
    }
}

вот тест:

it('should throw the error and redirect if the API fails with 404.', async () => {
        // Setup
        Config.get = jest.fn();
        Config.get.mockReturnValue(true);
        Config.initialize = jest.fn(() => Promise.resolve({ data: {} }));
        const req = jest.fn(),
            res = { redirect: jest.fn() },
            next = jest.fn();
        //global.fetch = jest.fn(() => new Promise((resolve) => resolve({ response: { ok: false, status: 404 } })));
        global.fetch = jest.fn(
            () =>
                new Promise((resolve) =>
                    resolve({
                        json: () => {
                            return { };
                        }
                        /* data: { ok: true } */
                    })
                )
        );

        // Act
        await middlewares.globalAuthHandler(req, res, next);
        //  Assert
        expect(res.redirect).toHaveBeenCalled();
        expect(res.redirect).toHaveBeenCalledWith('/signIn');
    });

Я не могу этого понять - даже после входа в журнал success!!! перенаправление не срабатывает.

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
0
900
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вызов await на middlewares.globalAuthHandler не ждет завершения, так как он не возвращает Promise.

Верните Promise, созданный fetch:

export function globalAuthHandler (req, res, next) {
  ...      
    return fetch(global_signin_url)  // <= return the Promise
    ...
}

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

Это даст res.redirect шанс получить колл до того, как он будет протестирован.

О Боже. глупый я! ... Большое спасибо @brian-lives-outdoors, это сработало как шарм :)

vaibhav 22.05.2019 13:11

Другие вопросы по теме