我的单元测试向.NET API发出http请求并使用kriskowal q库。当assert
调用then
回调并断言失败时,我会看到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
。
答案 0 :(得分:2)
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`
});