1
votes

I have some mocha/chai/chai-http tests that follow the below structure however whenever one test fails I get an UnhandledPromiseRejectionWarning which I can't seem to figure out it's source.

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()
        })
    })
})

I tried adding a .catch(err => Promise.reject(err) after the .then() but it didn't work either. What can I do here?

2

2 Answers

0
votes

The use of done callback together with promises is an antipattern. Promises are supported by modern testing frameworks, including Mocha. A promise should be returned from a test:

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({})
        })
    })
})
1
votes

I fixed this by adding .catch(err => done(err))