我发现仅增加超时的“解决方案”就掩盖了这里真正发生的事情,
- 您的代码和/或网络调用太慢(为了获得良好的用户体验,应少于100毫秒)
- 断言(测试)失败,并且某些东西吞没了错误,然后Mocha可以对它们采取行动。
当Mocha没有收到来自回调的断言错误时,您通常会遇到#2。这是由于其他一些代码将异常吞没到堆栈的上方而导致的。解决此问题的正确方法是修复代码,不要吞下错误。
当外部代码吞噬您的错误时
如果这是您无法修改的库函数,则需要捕获断言错误并将其自己传递给Mocha。为此,您可以将断言回调包装在try / catch块中,然后将所有异常传递给done处理程序。
it('should not fail', function (done) { // Pass reference here!
i_swallow_errors(function (err, result) {
try { // boilerplate to be able to get the assert failures
assert.ok(true);
assert.equal(result, 'bar');
done();
} catch (error) {
done(error);
}
});
});
当然可以将此样板提取到一些实用程序功能中,以使测试更加令人愉悦:
it('should not fail', function (done) { // Pass reference here!
i_swallow_errors(handleError(done, function (err, result) {
assert.equal(result, 'bar');
}));
});
// reusable boilerplate to be able to get the assert failures
function handleError(done, fn) {
try {
fn();
done();
} catch (error) {
done(error);
}
}
加快网络测试
除此之外,我建议您采纳有关开始使用测试存根进行网络调用以使测试通过而不必依赖于运行正常的网络的建议。使用Mocha,Chai和Sinon,测试可能看起来像这样
describe('api tests normally involving network calls', function() {
beforeEach: function () {
this.xhr = sinon.useFakeXMLHttpRequest();
var requests = this.requests = [];
this.xhr.onCreate = function (xhr) {
requests.push(xhr);
};
},
afterEach: function () {
this.xhr.restore();
}
it("should fetch comments from server", function () {
var callback = sinon.spy();
myLib.getCommentsFor("/some/article", callback);
assertEquals(1, this.requests.length);
this.requests[0].respond(200, { "Content-Type": "application/json" },
'[{ "id": 12, "comment": "Hey there" }]');
expect(callback.calledWith([{ id: 12, comment: "Hey there" }])).to.be.true;
});
});
有关更多信息,请参见Sinon的nise
文档。