Как проверить next () в промежуточном ПО Express в JEST - PullRequest
0 голосов
/ 15 мая 2019

После многих усилий я не смог понять это и, следовательно, планировал получить помощь. Я использую промежуточное программное обеспечение в моем приложении node + express, которое выглядит следующим образом:

import mainConfig from '../mainConfig/index';
const axios = require('axios');

module.exports = {
    authHandler: (req, res, next) => {
        return mainConfig.initialize().then(() => {
            const apiUri = mainConfig.get('app.api');
            if (apiUri) {
                return axios.get(apiUri).then(response => {
                    next();
                }).catch(error => {
                    res.redirect('/expired');
                    throw new Error(error);
                });
            }
        }).catch(() => {
        });
    }
};

Для этого я написал тестовый пример, в котором мне удалось смоделировать axios и мой модуль mainCongig. Теперь я хочу проверить, был ли вызван next(), поскольку запрос был разрешен для axios. Может ли кто-нибудь помочь мне с тем же?

контрольный пример, который я написал:

import mainConfig from '../mainConfig';
const axios = require('axios');

const middlewares = require('./check-auth');
jest.mock('axios');

describe('Check-Auth Token', () => {
    it('should call the Sign In API when live Conf is initalized and have the API URL', () => {

        mainConfig.get = jest.fn();
        mainConfig.get.mockReturnValue('https://reqres.in/api/users');
        mainConfig.initialize = jest.fn(() => Promise.resolve({ data: {} }));
        const req = jest.fn(), res = { sendStatus: jest.fn() }, next = jest.fn();
        axios.get.mockImplementation(() => Promise.resolve({ data: {} }));
        middlewares.authHandler(req, res, next);
        expect(next).toHaveBeenCalled(); // coming as not called.
    });
});

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Вам нужно дождаться разрешения промежуточного программного обеспечения.Когда вы возвращаете обещание из своего промежуточного программного обеспечения, вы можете подождать в тесте с оператором await:

import mainConfig from '../mainConfig';
const axios = require('axios');

const middlewares = require('./check-auth');
jest.mock('axios');

describe('Check-Auth Token', () => {
    it('should call the Sign In API when live Conf is initalized and have the API URL', async () => {

        mainConfig.get = jest.fn();
        mainConfig.get.mockReturnValue('https://reqres.in/api/users');
        mainConfig.initialize = jest.fn(() => Promise.resolve({ data: {} }));
        const req = jest.fn(), res = { sendStatus: jest.fn() }, next = jest.fn();
        axios.get.mockImplementation(() => Promise.resolve({ data: {} }));
        await middlewares.authHandler(req, res, next);
        expect(next).toHaveBeenCalled(); // coming as not called.
    });
});

Обратите внимание, что для использования ключевого слова await необходимо определитьваш тест с async.

0 голосов
/ 15 мая 2019

Я не эксперт, но, насколько я знаю, вы тестируете асинхронный код.Поэтому вы должны использовать ключевое слово done().Найти это для получения дополнительной информации: https://jestjs.io/docs/en/asynchronous

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