2016-01-09 9 views
11

Ich habe diesen Code mit Supertest und Mokka:Wie bekomme ich den tatsächlichen Serverfehler beim Ausführen von Supertest in Mocha?

import request from 'supertest'; 

//.... 

var newGame; 
describe('Creating game', function() { 
    beforeEach(function(done) { 
    request(app) 
     .post('/api/games') 
     .send({ 
     owner: 'Mr. X', 
     }) 
     .expect(201) 
     .expect('Content-Type', /json/) 
     .end((err, res) => { 
     if (err) { 
      return done(err); 
     } 
     newGame = res.body; 
     done(); 
     }); 
    });  

    describe('the created game', function() { 

    it('should name the specified owner', function() { 
     newGame.owner.should.equal('Mr. X'); 
    }); 

    ... 
    }) 
}); 

Wenn der Code-Server führt eine Ausnahme (zB Zugriff auf Eigenschaften eines undefinierten Objekt) Ich erhalte diese Stack-Trace

Error: expected 201 "Created", got 500 "Internal Server Error" 
    at Test._assertStatus (D:\Codes\theApp\node_modules\supertest\lib\test.js:232:12) 
    at Test._assertFunction (D:\Codes\theApp\node_modules\supertest\lib\test.js:247:11) 
    at Test.assert (D:\Codes\theApp\node_modules\supertest\lib\test.js:148:18) 
    at Server.assert (D:\Codes\theApp\node_modules\supertest\lib\test.js:127:12) 
    at emitCloseNT (net.js:1521:8) 

anstelle der tatsächlichen Fehler, der etwas wie "Zugriff auf Eigenschaften von undefined" sagt. Wie kann ich den tatsächlichen Fehler erhalten?

+0

Große Frage, wie es scheint, vielleicht nur alte Unit-Tests, dass die tatsächlichen Funktionen aufrufen könnte besser sein, stürzt auf die Spur? Oder vielleicht eine Kombination aus Supertests und Unit Tests: / –

Antwort

0

Es gibt wahrscheinlich viele Möglichkeiten, dies anzugehen, aber ich glaube nicht, dass Mocha oder Supertest Zugriff auf den tatsächlichen Fehler haben, der die 500 verursacht hat.

Was verwenden Sie zum Erstellen app? Wenn es sich um Express handelt, kann beispielsweise error-handling middleware während des Tests hinzugefügt werden, wodurch 500-induzierende Fehler in der Konsole protokolliert werden.

0

Sie können Ihren Testcode hören für das uncaughtException Ereignis haben, dass der Prozess erhöhen wird. Solange die Express-App die gesamte Verarbeitung im selben Prozess wie die Testhierarchie ausführt, wird jede nicht behandelte Ausnahme im Prozess an den Process UncaughtException-Ereignishandler gesendet. Nun, hier kann es ein bisschen knifflig werden. Da es ereignisbasiert ist, kann es jederzeit ausgelöst werden, wenn eine unbehandelte Ausnahme vorliegt. Wenn Sie also expliziter sein und nur Ausnahmen vom getesteten System behandeln möchten, müssen Sie den Listener hinzufügen/entfernen, bevor/nachdem der System-zu-Test-Code ausgeführt wird. Hier ist Ihr Beispiel aktualisiert, um auf eine nicht behandelte Ausnahme zu warten.

import request from 'supertest'; 

//.... 

var newGame; 
describe('Creating game', function() { 
    beforeEach(function(done) { 
    var unhandledException = undefined; 
    var unhandledExceptionCallback = function(err) { 
     unhandledException = err; 
    } 
    process.on('uncaughtException', unhandledExceptionCallback); 
    request(app) 
     .post('/api/games') 
     .send({ 
     owner: 'Mr. X', 
     }) 
     .expect(201) 
     .expect('Content-Type', /json/) 
     .end((err, res) => { 
     process.removeListener('uncaughtException', unhandledExceptionCallback); 
     if (unhandledException !== undefined){ 
      return done(unhandledException); 
     } else if (err) { 
      return done(err); 
     } 
     newGame = res.body; 
     done(); 
     }); 
    });  

    describe('the created game', function() { 

    it('should name the specified owner', function() { 
     newGame.owner.should.equal('Mr. X'); 
    }); 

    ... 
    }) 
});