摩卡超时与Q承诺失败的断言

为什么在Q未来内断言失败时,摩卡会超时? 发生这种情况时,您也不会看到断言失败。 这不会发生,如果我只使用callback。 我应该怎么写,而仍然使用期货,但看到断言错误,而不是超时?

var Q = require('q'); function hack() { var ret = Q.defer(); ret.resolve(true); return ret.promise; } it('test', function(done) { hack().then(function(bool) { assert(false); done(); }); }); 

断言调用会抛出一个exception,由Q捕获,以便符合promise 规范 。 所以摩卡从来没有达到done() ,也没有看到抛出exception。 你可以做这样的事情:

 it('test', function(done) { hack().then(function(bool) { assert(false); done(); }).catch(function(err){ done(err); }); }); 

或者,你可以完全省略done参数,直接从testing函数返回promise,在这种情况下,mocha将根据返回的promise的结果通过/不通过testing:

 it('test', function() { return hack().then(function(bool) { assert(false); }); }); 

…这是简化testingfunction的好方法。 道具在这个线程的其他地方指出这一点。

摩卡现在在unit testing中支持承诺,所以你可以返回承诺,而不是依赖从一个处理程序调用(done) 。 这更容易和更安全(因为你不会忘记打电话完成)

所以你可以写:

 it('test', function() { return hack().then(function(bool) { assert(false); }); }); 

这将失败,因为诺言会失败,摩卡会发现它。

这是来自摩卡文档的“使用承诺”部分: https : //mochajs.org/

提高greim的回答,包括在评论中添加的callumacrae ,你可以这样做:

 it('test', function(done) { hack().then(function(bool) { assert(false); done(); }).catch(done); });