如何在实验室中测试异常?

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

    });
  });
});