2014-12-07 108 views
1

我的單元測試向HTTP API請求HTTP請求並使用kriskowal q庫。當我做assert呼叫then回調和斷言失敗我看Error: timeout of 2000ms exceeded而不是AssertionError。我寫了一個例子來說明這種情況:錯誤:超過2000ms的超時。單元測試承諾

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

回答

2

Q不提供未處理的拒絕跟蹤,您需要明確地指示.done承諾信號鏈已結束。您在您的測試得到了抑制錯誤:

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

摩卡然而,提供了更好的承諾語法,你可以簡單地返回一個承諾,並有抑制轉向測試失敗:

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` 
}); 
+0

謝謝你的回答。有用! – user3414982 2014-12-08 18:31:06

+0

@ user3414982很高興我能幫忙,你可能想考慮一個更好的承諾實現。 – 2014-12-08 18:33:02