错误:超过 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 毫秒的超时。带有承诺的单元测试的主要内容,如果未能解决你的问题,请参考以下文章
排毒错误:超过 120000 毫秒的超时。用于异步测试和钩子