当使用Mocha测试异步代码并且我的一个断言失败时,所有Mocha都会报告超时错误。有没有办法改善这个?如何知道断言失败的原因以及原因?
mocha
Contact
#getContacts()
1) should return at least 1 contact
0 passing (3s)
1 failing
1) Contact #getContacts() should return at least 1 contact:
Error: timeout of 3000ms exceeded. Ensure the done() callback is being called in this test.
代码:
var assert = require("assert");
var contact = require("../lib/contact.js");
var chai = require('chai');
var should = chai.should();
describe('Contact', function() {
describe('#getContacts()', function() {
it('should return at least 1 contact', function(done) {
contact.getContacts().then(function(contacts) {
assert.equal(4,2)
done()
});
})
})
});
答案 0 :(得分:6)
问题是断言失败,抛出异常。这导致承诺被拒绝,但没有人注意到。您的代码仅检查承诺是否成功。如果您返回承诺,那么如果承诺被拒绝,则mocha将检查它并且未通过测试。
所以你想要
it('should return at least 1 contact', function() {
return contact.getContacts().then(function(contacts) {
assert.equal(4,2);
});
});
答案 1 :(得分:2)
你应该回复这样的承诺:
it('should return at least 1 contact', function() {
return contact.getContacts().then(function(contacts) {
assert.equal(4,2);
});
});
答案 2 :(得分:1)
似乎当assert抛出错误时,吞下错误并且从未显示错误,并且跳过断言抛出后的代码。
尝试这样(抓住拒绝):
Article
或者代替那时(null,rejectFunc)使用catch(rejectFunc)和像bluebird这样的库。
idbehold的答案也很棒。我还不知道mocha直接支持promises并且我总是使用done param知道如果我没有堆栈跟踪超时,那么在这个测试中有一个吞没错误。