如果一次运行4次以上的测试,Mocha会测试超时

时间:2013-10-21 13:50:07

标签: node.js mongodb express mocha

我有一个我用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之外复制这种行为。

到底是怎么回事?

1 个答案:

答案 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会完全关闭它,但我还没试过)。