可能未处理通过测试时出现错误

Possibly unhandled Error with passing tests

本文关键字:错误 测试 未处理      更新时间:2023-11-13

我有以下方法:

EventHandler.prototype.handle = function (event) {
    var me = this;
    return me.processEvent(event).then(function () {
        return me.saveLastSeenEventRevision(event);
    }).catch(function (err) {
        me.logger.debug("First attempt of event process failed, trying recovery");
        return me.recoveryStrategy.execute(event,me.processEvent.bind(me)).then(function()     {
            return me.saveLastSeenEventRevision(event);
        });
    });
};

我写了这个测试:

describe('when processEvent fails', function() {
    beforeEach(function () {
        instance.processEvent.returns(Bluebird.reject(new Error('rejection')));
    });
    describe('when recovery fails', function() {
        beforeEach(function () {
            instance.recoveryStrategy.execute.returns(Bluebird.reject(new Error('recovery rejected')));
        });
        it('should not save the revision', function(done) {
            instance.handle(event).catch(function() {
                sinon.assert.notCalled(instance.saveLastSeenEventRevision);
                done();
            }).done();
        });
    });
});

我模拟了processEvent方法的拒绝,在捕获函数中,我模拟了恢复实现的最终拒绝。我为这个方法写了更多的测试,但设置是一样的。所有测试都按预期通过了,但在控制台中我看到了以下消息:

Possibly unhandled Error: rejection

有没有其他方法来处理这些承诺以通过这一测试?

测试设置-mocha/chai/sinon,因为promise库使用bluebird。

好吧,你正在创建一个明确的拒绝,但没有在这里处理它:

instance.processEvent.returns(Bluebird.reject(new Error('rejection')));

蓝鸟看到你在这里制造了一个未经处理的拒绝,所以它会让你知道。这是因为一个真正的函数在调用时会返回拒绝,但sinon很早就创建了它,所以该应用程序有一个未处理的未决错误位置。你可以用关闭它

Bluebird.onPossiblyUnhandledRejection(function(){});

或者更好的方法是,按照承诺使用像sinon这样的工具,它可以让你做到:

instance.processEvent.rejects('rejection');

顺便说一句——不要使用愚蠢的done语法,Mocha已经内置了promise支持。您可以通过测试return承诺。

所以,问题出在sinon存根和设置返回值上。看来,把被拒绝的承诺作为回报价值,是西农内部如何评价的。

有两种选择:

  1. 不直接设置返回值,而是实现将要使用的函数,而不是存根一个

    sinon.stub(instance, 'processEvent', function() {
        return Bluebird.reject(new Error('rejected');
    });
    
  2. 按照承诺使用sinon库,该库允许以下内容:

    sinon.stub(instance, 'processEvent').rejects(new Error('rejected'));