Search code examples
node.jstestingmocha.jschaisupertest

Error: done() invoked with non-Error: {"req":{ ......} request done without error, but test didn't pass


I'm trying to resolve my test but nothing seems to work. Currently I'm using mocha, supertest and chai, but even if request was performed successfully, I'm seeing this annoying error I can't get rid of:

done() invoked with non-Error: {“req”:{ …} request done without error, but test didn't pass

Code:

let should = require('chai').should(),
    expect = require('chai').expect,
    constants = require('./constants'),
    supertest = require('supertest'),
    api = supertest(constants.ENVIRONMENT),
    express = require('express'),
    http = require('http'),
    request = require('request'),
    app = express(),
    bodyParser = require('body-parser'),
    port = process.env.PORT || 3000,
    assert = require('assert');
    
    describe('Create device API call', () => {

    function createToken() {
        return new Promise(resolve =>
            request.post(
                'myURl',
                { 
                 json: 
                        { 
                          "username": "myUsername", 
                          "password": "myPassword" 
                        } 
                },
                function (error, response, body) {
                    if (!error && response.statusCode == 200) {
                        let token = (body.accessList[0].accessToken);
                        resolve(token);

                    }
                    else {
                        console.log("Server error get token")
                    }

                })
        )
    }

    it('should create device', async (done) => {

        let token = await createToken();

        //console.log(`Token is ${token}`);

        api.post('/deviceManifests/1/devices')
            .set('Accept', 'application/json')
            .set('Authorization', `Bearer ${token}`)
            .send({
                "name": "QA integration",
                "deviceKey": "somekey38957",
                "defaultBinding": true
            })
            .expect('content-Type', /json/)
            .expect(201)
            .expect(function (res, err) {
                assert.equal(res.body.name, 'QA integration');

            }).then(done);
    });

});    


Solution

  • You are passing done into then.

    Therefore, done will be passed an argument.

    However, if you pass an argument to done, it expects it to be an error.

    Try this instead:

    .then(function () {
      done()
    })
    

    ...or using an arrow function:

    .then(() => done())