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