我有一个我用Mocha测试的node.js + express web服务器。我在测试工具中启动Web服务器,并连接到mongodb以查找输出:
describe("Api", function() {
before(function(done) {
// start server using function exported from another js file
// connect to mongo db
});
after(function(done) {
// shut down server
// close mongo connection
});
beforeEach(function(done) {
// empty mongo collection
});
describe("Events", function() {
it("Test1", ...);
it("Test2", ...);
it("Test3", ...);
it("Test4", ...);
it("Test5", ...);
});
});
如果Mocha一次运行超过4个测试,则会超时:
4 passing (2s)
1 failing
1) Api Test5:
Error: timeout of 2000ms exceeded
at null.<anonymous> (C:\Users\<username>\AppData\Roaming\npm\node_modules\moch\lib\runnable.js:165:14)
at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
如果我跳过 5个测试中的任何一个,它会成功通过。如果我重新排序测试(它总是最后一次超时),也会出现同样的问题。将测试拆分成组也不会改变事情。
从戳它开始,最终测试的请求被发送到Web服务器(使用http模块),但是没有被express接收。一些测试提出了一个请求,有些不止一个。它不会影响我跳过的结果。我无法在mocha之外复制这种行为。
到底是怎么回事?
答案 0 :(得分:4)
使用Mocha,如果你声明你的(测试)函数回调的第一个参数(通常称为done
),你必须调用它,否则Mocha会等到它被调用(并最终超时)。如果您在测试中不需要它,请不要声明它:
it('test1', function(done) {
..
// 'done' declared, so call it (eventually, usually when some async action is done)
done();
});
it('test2', function() {
// not an async test, not declaring 'done', obviously no need to call it
});
由于您使用的是http
,请尝试增加http.globalAgent.maxSockets
(默认为5):
var http = require('http');
http.globalAgent.maxSockets = 100;
(我相信0会完全关闭它,但我还没试过)。