Aniket
Aniket

Reputation: 5368

Supertest : Can't set headers after they are sent

express and mongoose.

For testing I am using supertest, mocha and mockgoose.

When I try to set the auth token for two consecutive tests, the second one fails throwing Can't set headers after they are sent.

The test case is shown below.

var chai = require('chai'),
    expect = chai.expect,
    server = null, 
    request = require('supertest'),
    mockgoose = require('mockgoose'),
    mongoose = require('mongoose');

describe('Organization', () => {

    var token = 'success_token',
        orgName = 'default_org_name',
        users,
        organization;

    before((done) => {
        mockgoose(mongoose);
        server = request(require('../../server/server.js'));
    });

    it('should get list of organizations for a proper user', (done) => {

        server
            .get('/api/organization/')
            .set({token : token})
            .expect(200)
            .end((err, res) => {
                if (err) return done(err);
                expect(res.body.length).to.equal(1);
                expect(res.body[0].name).to.equal(orgName);
                done();
            });

    });

    it('should send a 500 response for a incorrect user', (done) => {

        var errorToken = 'error token';

        server
            .get('/api/organization/')
            .set({token : errorToken})
            .expect(500)
            .end((err, res) => {
                if (err) return done(err);
                done();
            });

    });

    after((done) => {
        mockgoose.reset();
        done();
    });


});

The first test case passes, however the second test case fails. It throws an error

Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:346:11)
    at ServerResponse.header (/home/tricon/aniket/dev/publab/triconpublish_api/node_modules/express/lib/response.js:718:10)
    at ServerResponse.send (/home/tricon/aniket/dev/publab/triconpublish_api/node_modules/express/lib/response.js:163:12)
    at ServerResponse.json (/home/tricon/aniket/dev/publab/triconpublish_api/node_modules/express/lib/response.js:249:15)
    at ServerResponse.send (/home/tricon/aniket/dev/publab/triconpublish_api/node_modules/express/lib/response.js:151:21)
    at /home/tricon/aniket/dev/publab/triconpublish_api/server/filter.js:9:1744
    at Query.<anonymous> (/home/tricon/aniket/dev/publab/triconpublish_api/node_modules/mongoose/lib/query.js:2169:28)
    at /home/tricon/aniket/dev/publab/triconpublish_api/node_modules/kareem/index.js:177:19
    at /home/tricon/aniket/dev/publab/triconpublish_api/node_modules/kareem/index.js:109:16
    at _combinedTickCallback (node.js:370:9)
    at process._tickDomainCallback (node.js:425:11)

I don't get the reason.

You can notice that I am setting two different tokens. One for success scenario and another for error scenario. If I set the same success token in the second test case, it doesn't throw this error.

Please Help !!!

Upvotes: 2

Views: 3850

Answers (1)

Mikelax
Mikelax

Reputation: 572

I think that you need to change your before function call to be a beforeEach call. This will reset your server to your known base state before each test. Currently it is running just before the first test.

This SO answer talks about node's serverResponse object. This should help you in making sure your server is set up before each test is run.

Upvotes: 1

Related Questions