【问题标题】:Error: timeout of 2000ms exceeded. Unit test with promises错误:超过 2000 毫秒的超时。带有承诺的单元测试
【发布时间】:2015-02-05 06:58:32
【问题描述】:

我的单元测试向 NET API 发出 http 请求并使用 kriskowal q 库。当我在then 回调中调用assert 并且断言失败时,我看到Error: timeout of 2000ms exceeded 而不是AssertionError。我写了一个例子来说明这种情况:

var assert = require('assert')
  , Q = require('q');

it('promise', function(cb){
    var deferred = Q.defer();
    deferred.promise.then(function(){
        assert(false);
        cb();
    });
    deferred.resolve();
});

我无法理解这种行为。使用setTimeout/setImmediate 建模异步行为显示正常AssertionError

【问题讨论】:

    标签: javascript node.js promise mocha.js assert


    【解决方案1】:

    Q 不提供未处理的拒绝跟踪,您需要明确地.done 承诺表明链已结束。您在测试中遇到抑制错误:

    it('promise', function(cb){
        var deferred = Q.defer();
        deferred.promise.then(function(){
            assert(false);
            cb();
        }).done(); // NOTE THE DONE
        deferred.resolve();
    });
    

    然而,Mocha 提供了更好的 Promise 语法,您可以简单地返回一个 Promise 并将拒绝转为测试失败:

    it('promise', function(cb){
        return new Q.Promise(function(resolve){ resolve(); }). // use the new syntax
        then(function(){
            assert(false);
            cb();
        });// no done needed because of the `return`
    });
    

    【讨论】:

    • @user3414982 很高兴我能提供帮助,您可能需要考虑更好的承诺实现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2017-04-15
    • 2017-06-23
    • 2019-10-30
    • 1970-01-01
    • 2018-11-13
    相关资源
    最近更新 更多