Как протестировать простое промежуточное ПО - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть 3 промежуточные программы, подобные этой:

module.exports = {

    validateRequest: function(req, res, next) {
        return new Promise((resolve, reject) => {
            if(!req.body.title || !req.body.location || !req.body.description || !req.body.author){
            Promise.reject('Invalid')
            res.status(errCode.invalid_input).json({
              message: 'Invalid input'
            })
         }
     })
    },
    sendEmail: ...,
    saveToDatabase: ...

}

Я использую их в своем маршруте следующим образом:

const { validateRequest, sendEmail, saveToDatabase } = require('./create')
...
api.post('/create', validateRequest, sendEmail, saveToDatabase);

Это работает, но я не могу проверить это.Вот моя (неудачная) попытка:

test('create.validateRequest should throw error if incorrect user inputs', (done) => {
  const next = jest.fn();
  const req = httpMocks.createRequest({ 
    body: { 
            title: 'A new world!',
            location: '...bunch of talks...',
            description: '...'  
    }
  });
  const res = httpMocks.createResponse();
  expect(validateRequest(req, res, next)).rejects.toEqual('Invalid')

})

Jest выводит это:
Ошибка
Недопустимый

Вопрос: Как я могу проверить этоvalidateRequest middleware?

1 Ответ

0 голосов
/ 02 декабря 2018

Итак, во-первых, предполагая, что это Express, нет никаких причин (или требований) возвращать Promise из вашего промежуточного программного обеспечения, возвращаемые значения игнорируются.Во-вторых, ваш текущий код фактически приведет к зависанию действительных запросов, потому что вы не вызываете next для передачи запроса следующему промежуточному программному обеспечению.

Принимая это во внимание, ваше промежуточное ПО должно выглядеть немного больше как

validateRequest: (req, res, next) => {
  if (!req.body.title || !req.body.location || !req.body.description || !req.body.author) {
    // end the request
    res.status(errCode.invalid_input).json({
      message: 'Invalid input'
    });
  } else {
    // process the next middleware
    next();
  }
},

На основании вышеизложенного действительный модульный тест будет выглядеть как

test('create.validateRequest should throw error if incorrect user inputs', () => {
  const next = jest.fn();
  const req = httpMocks.createRequest({ 
    body: { 
      title: 'A new world!',
      location: '...bunch of talks...',
      description: '...'  
    }
  });
  const res = httpMocks.createResponse();
  validateRequest(req, res, next);
  // validate HTTP result
  expect(res.statusCode).toBe(400);
  expect(res._isJSON()).toBeTruthy();
  // validate message
  const json = JSON.parse(res._getData());
  expect(json.message).toBe('Invalid input');
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...