我有一个由 express 运行的 https 服务器,我使用 mocha 和 supertest 对其进行测试。
我的问题是 - 如果我只运行测试 - 没关系。如果我尝试使用测试运行 gruntfile 然后运行 express - 我看到很多 EADDRINUSE 错误,即使在测试文件中我使用 app.close() 执行 after()。同样适用于测试中的监视任务。
这是我的示例测试:
/* jshint node: true*/
/*global describe, it, after*/
(function() {
'use strict';
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
var request = require('supertest');
var app = require('../server.js').app;
var expect = require('chai').expect;
var Cookies;
after(function(done) {
app.close();
setTimeout(function(){done();}, 1500);
});
describe('/login', function() {
it('should auth the user', function(done) {
request(app)
.post('/login')
.send({login: "test", password: 'test'})
.expect(302)
.end(function(err, res) {
expect(err).to.be.equal(null);
expect(res.text).to.be.equal("Moved Temporarily. Redirecting to /");
Cookies = res.headers['set-cookie'].pop().split(';')[0];
done();
});
});
});
// testing API for serving session data for angualar factory
describe('/api/session', function() {
it('should return session data in JSON', function(done) {
var req = request(app).get('/api/session');
req.cookies = Cookies;
req.set('Accept','application/json')
.end(function(err, res) {
expect(err).to.be.equal(null);
expect(res.body).to.have.property("_id");
done();
});
});
});
}());
我知道这些测试远非完美。我刚刚通过适当的软件测试开始我的冒险。
所有那些“已经在使用的端口”都是显而易见的,而且它们都没有......给出任何问题。所有测试工作正常,服务器工作正常,但标准输出很疯狂。这种行为远非理想,并且可能充满潜在问题和不稳定问题。
我的问题是 - 如何摆脱它?
我的想法是:
创建专用服务器以在不同的端口上进行测试。不幸的是,我必须知道如何实现这一点。
如果 superagent 未运行,则为它运行服务器设置一些条件,或者只是...将其传递给 superagent?
使用其他东西然后超级代理(如请求,但我不确定是否所有 cookie 和 node_tls_reject_unauthorized 都可以工作。
正如你所看到的 - 我在这个话题上挣扎并且问题多于答案,并且没有足够的经验知道在哪里看。
我很感激任何帮助。
编辑:
我发现,我可以做到:
before(function(done) {
app.listen(3001, function() { done(); });
});
它开始在另一个端口上进行测试,但是......整个 server.js 无论如何都被加载了,所以它也开始了。然后,当它与运行的服务器一起触发时,有明显的EADDRINUSE。