2015-03-12 10 views
5

Ich schreibe Testfälle mit lab und ich möchte testen, ob eine Ausnahme von meinem Plugin geworfen wird. Das Problem ist, hapi lässt die Ausnahme aufblasen und setzt auch die Antwort auf den internen Serverfehler 500, was dazu führt, dass mein Test fehlschlägt.So testen Sie Ausnahmen im Labor?

Wir können für diese Antwort expect(res.statusCode).to.equal(500) testen, aber der Test wird immer noch fehlschlagen.

Ich kann try/catch um server.inject nicht verwenden, da die Ausnahme asynchron ausgelöst wird.

Wie verwende ich Lab um Ausnahmen zu testen?

Antwort

2

Ein Fehler in einem Handler wird von domain auf dem Objekt request abgefangen. Sie können auf die Anwesenheit davon ein paar verschiedene Möglichkeiten testen.

Ich bin nicht besonders glücklich mit einer dieser Ideen, aber sie funktionieren beide. Hoffentlich kennt jemand anders einen besseren Weg.

Das Plugin

exports.register = function (server, options, next) { 

    server.route({ 
     method: 'GET', 
     path: '/', 
     handler: function (request, reply) { 

      throw new Error('You should test for this'); 

      reply(); 
     } 
    }); 

    next(); 
} 

Der Test

describe('Getting the homepage', function() { 

    it('Throws an error', function (done) { 

    server.inject({url: '/'}, function (resp) { 

     var error = resp.request.response._error; 

     expect(error).to.be.an.instanceof(Error); 
     expect(error.message).to.equal('Uncaught error: You should test for this'); 
     done(); 

    }); 
    }); 
}); 

Alternative

Wenn Sie die ich mag Wenn Sie auf die private _error-Eigenschaft zugreifen (wie oben), können Sie dem domain einen Listener hinzufügen und den Fehler selbst auf der Anforderung object speichern.

server.ext('onPreHandler', function (request, reply) { 

    request.domain.on('error', function (error) { 
     request.caughtError = error; 
    }); 

    reply.continue(); 
}); 

Der Test

describe('Getting the homepage', function() { 

    it('Throws an error', function (done) { 

    server.inject({url: '/'}, function (resp) { 

     var error = resp.request.caughtError; 

     expect(error).to.be.an.instanceof(Error); 
     expect(error.message).to.equal('Uncaught error: You should test for this'); 
     done(); 

    }); 
    }); 
}); 
+0

Matt, vielen Dank für Ihre Hilfe! Ich habe gerade Ihre Lösung ausprobiert und das Problem ist, dass die Ausnahme immer noch funktioniert, was dazu führt, dass mein Test fehlschlägt. Was ich tun muss, ist sicherzustellen, dass mein Test die Ausnahme abfängt und dann prüft, ob die Ausnahme so ist, wie wir es erwarten. Gibt es eine Möglichkeit, die Domain anzuzapfen und die Ausnahme erneut in unseren Test zu channeln, um abgefangen zu werden? –

+0

Genauer gesagt, wenn wir den Listener zu request.domain.on hinzufügen ('error', callback) können wir auch die Weitergabe dieser Ausnahme dort und dann stoppen? –

+0

Ich habe herausgefunden, was das Problem war. Ich musste meine 'onPreHandler'-Erweiterung vor meinem Plugin verschieben. –