Написание шутного теста для связанных функций в node.js - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть функция, которую я хочу протестировать с помощью jest, функция выполняет некоторые проверки токена и принимает 3 параметра

это код функции, которую я хочу проверить:

const verifyToken = (req, res, next) => {
    // check header or url parameters or post parameters for token
    var token = req.headers['x-access-token']

    if (!token) return res.status(403).send({ auth: false, message: 'No token provided.' })

    // verifies secret and checks expire date
    jwt.verify(token, config.secret, (err, decoded) => {
        if (err) return res.status(500).send({ auth: false, message: 'Failed to authenticate token.' })

        //put user inside req.user to use the user in other routes
        User.findById(decoded.id, (err, user) => {
            if (err) {
                return res.status(500).json({
                    message: err
                })
            } else if (!user) {
                return res.status(404).json({
                    message: 'No user found'
                })
            } else {
                req.user = user
            }
            next()
        })
    })
}

поэтому я пишу первый тест, который проверяет, не выдан ли токен в запросе, что он отправляет 403 с сообщением. Следующий тест.

const verifyToken = require('../../config/token')

describe('veryfiy token tests', () => {
    it('Should give 403 status when no token is present', () => {
        let mockReq = {
            headers: {}
        }
        var mockRes = {
            status: code => code
            send: message => message
        }

        let nextCalled = false

        let next = () => {
            nextCalled = true
        }

        expect(verifyToken(mockReq, mockRes, next)).toBe(403)
    })
})

Теперь тест проходит с ошибкой: Ошибка типа: res.status (...). Send не является функцией

когда я удалил .send () из res.status в коде, тест проходит.

Я пытался выяснить, как смоделировать и status (), и send () на объекте res. но пока не нашли решения.

Tnx

1 Ответ

0 голосов
/ 07 сентября 2018

Мне кажется, проблема в том, что результат res.status() не имеет функции с именем send().

Попробуйте использовать это:

  var mockRes = {
    status: code => ({
      send: message => ({code, message})
    }),
  };

Вы должны быть в состоянии проверить с:

  var result = verifyToken(mockReq, mockRes, next);
  expect(result.code).toBeDefined();
  expect(result.code).toBe(403);

PS: код еще не проверен:)

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