5

我有一个 node.js + express 网络服务器,我正在用 Mocha 进行测试。我在测试工具中启动 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 接收。有些测试提出一个请求,有些则不止一个。它不影响我跳过的结果。我无法在摩卡咖啡之外复制这种行为。

到底是怎么回事?

4

1 回答 1

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

于 2013-10-21T14:02:13.623 回答