Jest макет функция возвращает неопределенный вместо объекта - PullRequest
1 голос
/ 22 апреля 2020

Я пытаюсь создать модульные тесты для своего промежуточного программного обеспечения в приложении Express.

Промежуточное программное обеспечение так просто:

const jwt = require('jsonwebtoken');

const auth = (req, res, next) => {
    const tokenHeader = req.headers.auth; 

    if (!tokenHeader) {
        return res.status(401).send({ error: 'No token provided.' });
    }

    try {
        const decoded = jwt.verify(tokenHeader, process.env.JWT_SECRET);

        if (decoded.id !== req.params.userId) {
            return res.status(403).json({ error: 'Token belongs to another user.' });
        }

        return next();
    } catch (err) {
        return res.status(401).json({ error: 'Invalid token.' });
    }
}

module.exports = auth; 

И это мой тест, в котором я хочу убедиться, что если токен в порядке, все будет go гладко, а промежуточное ПО - просто звонки next():

it('should call next when everything is ok', async () => {
        req.headers.auth = 'rgfh4hs6hfh54sg46';
        jest.mock('jsonwebtoken/verify', () => {
            return jest.fn(() => ({ id: 'rgfh4hs6hfh54sg46' }));
        });
        await auth(req, res, next);
        expect(next).toBeCalled();
});

Но вместо того, чтобы возвращать объект с полем и идентификатором по желанию, макет всегда возвращает неопределенное значение. Я попытался вернуть объект вместо jest.fn (), но он тоже не сработал.

Я знаю, что здесь есть несколько похожих потоков при переполнении стека, но, к сожалению, ни одно из предложенных решений не сработало для меня.

Если требуется больше контекста, здесь - мой полный набор тестов. Заранее спасибо.

1 Ответ

1 голос
/ 23 апреля 2020

Один из способов решить эту проблему - смоделировать модуль jsonwebtoken и затем использовать mockReturnValue для метода, который нужно смоделировать. Рассмотрим этот пример:

const jwt = require('jsonwebtoken');

jest.mock('jsonwebtoken');

jwt.verify.mockReturnValue({ id: 'rgfh4hs6hfh54sg46' });

it('should correctly mock jwt.verify', () => {
  expect(jwt.verify("some","token")).toStrictEqual({ id: 'rgfh4hs6hfh54sg46' })
});
...