Скажем, у меня есть логика контроллера:
// 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)
}
- На сервере разработки маршрут работает нормально.
- Я реализовал промежуточное ПО для обработки ошибок.Ошибка 401 может быть правильно передана промежуточному программному обеспечению и дает ответ 401.
- Я использую Mocha + Supertest (и Sinon + SinonTest, когда мне нужно заглушить некоторые методы) для тестирования.
- Тест «счастливого пути» может пройти.
- Тесты на печальные пути, созданные другими промежуточными программами до того, как контроллер (например, экспресс-проверка) будет правильно обнаружен в тесте.
Но при проверке печальных путей в контроллере всегда выдается ошибка тайм-аута:
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попытался до сих пор, но не сработало:
- использовать обратный вызов Mocha
done()
вместо возврата Supertest обещания - заглушку все асинхронные вызовы для немедленного возврата
- увеличениевремя ожидания
Пожалуйста, помогите, если у вас есть какие-либо подсказки о том, что возможно идет не так.Это действительно меня беспокоит, потому что я не могу проверить какие-либо грустные пути в контроллере, а когда тест не пройден, я никогда не увижу фактическую ошибку.