【问题标题】:How to test exceptions in lab?如何在实验室中测试异常?
【发布时间】:2015-03-14 01:23:24
【问题描述】:

我正在使用lab 编写测试用例,我想测试我的插件是否引发了异常。问题是,hapi 允许异常冒泡,同时还设置了对内部服务器错误 500 的响应,这导致我的测试失败。

我们可以测试此响应expect(res.statusCode).to.equal(500),但测试仍然会失败。

我不能在 server.inject 周围使用 try/catch,因为异常是异步抛出的。

如何使用实验室测试异常?

【问题讨论】:

    标签: hapijs


    【解决方案1】:

    处理程序内部抛出的错误被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();
    }
    

    测试

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

    【讨论】:

    • 马特,感谢您的帮助!我刚刚尝试了您的解决方案,问题是异常仍然存在,导致我的测试失败。我需要做的是确保我的测试捕捉到异常,然后检查以确保异常是我们所期望的。有什么方法可以进入域并将异常重新引导到我们的测试中以被捕获?
    • 更具体的问题,当我们将监听器添加到 request.domain.on('error', callback) 时,我们是否也可以立即停止该异常的传播?
    • 我发现了问题所在。我不得不在我的插件之前移动我的“onPreHandler”扩展。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多