错误:超过 2000 毫秒的超时。带有承诺的单元测试

Posted

技术标签:

【中文标题】错误:超过 2000 毫秒的超时。带有承诺的单元测试【英文标题】:Error: timeout of 2000ms exceeded. Unit test with promises 【发布时间】: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

【问题讨论】:

【参考方案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 很高兴我能提供帮助,您可能需要考虑更好的承诺实现。

以上是关于错误:超过 2000 毫秒的超时。带有承诺的单元测试的主要内容,如果未能解决你的问题,请参考以下文章

mocha 的单元测试错误:超过 20000 毫秒的超时

摩卡柴解决多个承诺

Mocha/Sinon 测试猫鼬里面的快递

排毒错误:超过 120000 毫秒的超时。用于异步测试和钩子

在mocha测试中调用异步函数如何避免超时错误:超过2000ms的超时

测试有超时的 axios api 调用