2016-04-18 8 views
1

Express und Mungo.Supertest: Kann Header nicht festlegen, nachdem sie gesendet werden

Zum Testen verwende ich Supertest, Mokka und Mockgoose.

Wenn ich die Auth-Token für zwei aufeinanderfolgende Tests einzustellen, schlägt die zweiten Can't set headers after they are sent.

Den Testfall zu werfen ist unten gezeigt.

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


}); 

Der erste Testfall besteht, aber der zweite Testfall schlägt fehl. Es wirft einen Fehler

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) 

ich den Grund nicht bekommen.

Sie können feststellen, dass ich zwei verschiedene Token setze. Eine für das Erfolgsszenario und eine für das Fehlerszenario. Wenn ich im zweiten Testfall dasselbe Erfolgstoken setze, wird dieser Fehler nicht ausgelöst.

Bitte Hilfe !!!

Antwort

0

Ich denke, dass Sie Ihren vor Funktionsanruf ändern müssen, um ein beforeEach-Aufruf zu sein. Dadurch wird Ihr Server vor jedem Test auf Ihren bekannten Basiszustand zurückgesetzt. Momentan läuft es kurz vor dem ersten Test.

Diese SO answer spricht über ServerResponse-Objekt des Knotens. Dies sollte Ihnen dabei helfen, sicherzustellen, dass Ihr Server vor jedem Test eingerichtet wird.