Res.Redirect не вызывается в Jest Test - PullRequest
1 голос
/ 22 мая 2019

Я использую 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!!! перенаправление не запускается.

1 Ответ

1 голос
/ 22 мая 2019

Вызов await на middlewares.globalAuthHandler не ждет его завершения, поскольку он не возвращает Promise.

Возвращает Promise, созданное fetch:

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

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

Это даст res.redirect шанс быть вызванным до того, как его проверят.

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