Экспресс Супертест всегда выдает ошибку тайм-аута для ошибок, выданных в обещании - PullRequest
0 голосов
/ 24 мая 2018

Скажем, у меня есть логика контроллера:

// registered for route POST /login
function login(req, res, next) {
  User.findOne({username: req.body.username}).exec()
    .then(user => {
      if (user) { 
        return bcrypt.compareAsync(req.body.password, user.password) 
      } else { 
        throw new APIError("Unauthorized", 401) 
      }
    })
    .then(some more chained promises)
    .catch(next)
}
  1. На сервере разработки маршрут работает нормально.
  2. Я реализовал промежуточное ПО для обработки ошибок.Ошибка 401 может быть правильно передана промежуточному программному обеспечению и дает ответ 401.
  3. Я использую Mocha + Supertest (и Sinon + SinonTest, когда мне нужно заглушить некоторые методы) для тестирования.
  4. Тест «счастливого пути» может пройти.
  5. Тесты на печальные пути, созданные другими промежуточными программами до того, как контроллер (например, экспресс-проверка) будет правильно обнаружен в тесте.

Но при проверке печальных путей в контроллере всегда выдается ошибка тайм-аута:

it('throws unauthorized error if no user match', () => {
  return request(app)
    .post('/login')
    .send({ username: 'notExistInDB', password: 'asdfasd'})
    .expect(401)
})

Этот тест завершается неудачно с сообщением об ошибке:

Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.

Вещи Iпопытался до сих пор, но не сработало:

  1. использовать обратный вызов Mocha done() вместо возврата Supertest обещания
  2. заглушку все асинхронные вызовы для немедленного возврата
  3. увеличениевремя ожидания

Пожалуйста, помогите, если у вас есть какие-либо подсказки о том, что возможно идет не так.Это действительно меня беспокоит, потому что я не могу проверить какие-либо грустные пути в контроллере, а когда тест не пройден, я никогда не увижу фактическую ошибку.

...