摩卡超时与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); });