У меня есть несколько тестов mocha / chai / chai-http, которые следуют приведенной ниже структуре, однако всякий раз, когда один тест терпит неудачу, я получаю UnhandledPromiseRejectionWarning, источник которого я не могу понять.
UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch().
describe('indexData', () =>{
it('Should return status code 200 and body on valid request', done => {
chai.request(app).get('/api/feed/indexData')
.query({
topN: 30,
count: _.random(1, 3),
frequency: 'day'
})
.set('Authorization', token).then(response => {
// purposefully changed this to 300 so the test fails
expect(response.statusCode).to.equal(300)
expect(response.body).to.not.eql({})
done()
})
})
})
Я попытался добавить .catch(err => Promise.reject(err) после .then(), но это тоже не сработало. Что я могу здесь сделать?





Я исправил это, добавив .catch(err => done(err))
Использование обратного вызова done вместе с обещаниями является антипаттерном. Обещания поддерживаются современными средами тестирования, включая Mocha. Обещание должно быть возвращено из теста:
it('Should return status code 200 and body on valid request', () => {
return chai.request(app).get('/api/feed/indexData')
.query({
topN: 30,
count: _.random(1, 3),
frequency: 'day'
})
.set('Authorization', token).then(response => {
// purposefully changed this to 300 so the test fails
expect(response.statusCode).to.equal(300)
expect(response.body).to.not.eql({})
})
})
})
Но у вас уже есть обещание, которое вы можете использовать, поэтому это антипаттерн. Если бы не было обещаний, done, вероятно, подошел бы.
Понятно. Спасибо.
А, ладно, я этого не знал. Что, если бы я хотел использовать
doneвместо обещаний?