1

我正在使用 supertest 对我的服务器配置和路由处理程序进行单元测试。服务器配置测试在test.server.js,路由处理测试在test.routes.handlers.js.

当我使用 运行所有测试文件mocha .时,我得到EADDRINUSE. 当我单独运行每个文件时,一切都按预期工作。

这两个文件都定义并要求 supertest,request = require('supertest')和 express 服务器文件, app = require('../server.js'). 在server.js中,服务器是这样启动的:

http.createServer(app).listen(app.get('port'), config.hostName, function () {
  console.log('Express server listening on port ' + app.get('port'));
});

我的实施有问题吗?运行测试时如何避免EADDRINUSE错误?

4

2 回答 2

4

mocha 有一个根套件

You may also pick any file and add "root" level hooks, for example add beforeEach() outside of describe()s then the callback will run before any test-case regardless of the file its in. This is because Mocha has a root Suite with no name.

我们使用它来启动 Express 服务器一次(并且我们使用环境变量,以便它在与我们的开发服务器不同的端口上运行):

before(function () {
  process.env.NODE_ENV = 'test';
  require('../../app.js');
});

(我们done()这里不需要,因为 require 是同步的。)也就是说,服务器只启动一次,不管有多少不同的测试文件包含这个根级before函数。

尝试在每个文件中运行之前从根级别要求 supertest。

于 2013-09-14T13:57:56.583 回答
1

回答我自己的问题:

我的超测初始化如下所示:

var app = require('../server.js');
var request = require('supertest')(app);

test.server.js中,我将这些 require 语句直接放在describe. 在test.routes.handlers.js中,语句在 a beforeinside a 内describe

在阅读了 dankohn 的回答后,我受到启发,只需将语句移到任何describeor之外的最顶部before,现在测试都运行没有问题。

于 2013-09-14T16:59:34.330 回答