为什么在Q期限内断言失败时mocha会超时?发生这种情况时,您也无法看到断言失败。如果我只使用回调,就不会发生这种情况。我应该如何在仍然使用期货的同时写这个但是看到断言错误而不是超时?
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();
});
});
答案 0 :(得分:10)
断言调用抛出一个异常,它被Q捕获,以便正确地符合承诺spec。因此,mocha永远不会达到done()
,也不会看到抛出的异常。你可以这样做:
it('test', function(done) {
hack().then(function(bool) {
assert(false);
done();
}).catch(function(err){
done(err);
});
});
[edit]或者,您可以完全省略done
参数并直接从测试函数返回promise,在这种情况下,mocha将根据返回的promise的结果通过/不通过测试:< / p>
it('test', function() {
return hack().then(function(bool) {
assert(false);
});
});
...这是简化测试功能的好方法。在这个帖子中向Taytay道具的道具指出了这一点。
答案 1 :(得分:3)
Mocha现在支持单元测试中的promise,因此您可以返回promise,而不是依赖于从当时的处理程序调用{{1}}。它更容易,更安全(因为你不会忘记调用完成)
所以你可以写:
(done)
那会失败,因为承诺会失败,而Mocha会检测到它。
这是来自“使用承诺”部分中的Mocha文档:https://mochajs.org/
答案 2 :(得分:1)
改进greim's answer,包括callumacrae added in a comment,您可以这样做:
it('test', function(done) {
hack().then(function(bool) {
assert(false);
done();
}).catch(done);
});