我正在使用实验室编写测试用例,我想测试是否从我的插件中抛出异常.问题是,hapi允许异常冒泡,同时还设置对内部服务器错误500的响应,这导致我的测试失败.
我们可以测试这个响应,expect(res.statusCode).to.equal(500)但测试仍然会失败.
我不能使用try/catch,server.inject因为异步是异步抛出的.
如何使用实验室测试异常?
处理程序内部抛出的错误由对象domain捕获request。您可以通过几种不同的方式测试其是否存在。
我对这两个想法都不是特别满意,但它们都有效。希望其他人知道更好的方法。
插件
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();
}
Run Code Online (Sandbox Code Playgroud)
考试
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();
});
});
});
Run Code Online (Sandbox Code Playgroud)
选择
如果您不喜欢访问私有属性的想法_error(如上所述),您可以向 中添加一个侦听器domain,并自行将错误存储在 request 上object。
server.ext('onPreHandler', function (request, reply) {
request.domain.on('error', function (error) {
request.caughtError = error;
});
reply.continue();
});
Run Code Online (Sandbox Code Playgroud)
考试
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();
});
});
});
Run Code Online (Sandbox Code Playgroud)