我有一个由express运行的https服务器,我使用mocha和supertest对其进行测试。
我的问题是 - 如果我只运行测试 - 就可以了。如果我尝试使用 test 运行 gruntfile,然后运行 express - 我会看到很多 EADDRINUSE 错误,即使在测试文件中我使用 after() 和 app.close() 进行操作。
这同样适用于测试中的观察任务。
这是我的测试示例:
/* 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();
});
});
});
}());
我知道这些测试远非完美。我刚刚开始我的冒险之旅,进行适当的软件测试。
所有这些“端口已在使用中”都是显而易见的,并且没有一个......给出任何问题。所有测试都工作正常,服务器工作正常,但标准输出很疯狂。这种行为远非理想,并且可能充满潜在问题和不稳定问题。
我的问题是 - 如何摆脱它?
我的想法是:
创建专用服务器以在不同端口上进行测试。不幸的是我必须知道如何实现这一点。
如果超级代理没有运行,则为超级代理运行服务器设置一些条件,或者只是...将其传递给超级代理,否则?
使用其他东西然后超级代理(例如请求,但我不确定所有cookie和node_tls_reject_unauthorized是否都有效。
正如你所看到的——我对这个话题很挣扎,问题多于答案,而且没有足够的经验来知道在哪里看。
我非常感谢任何帮助。
EDIT:
我发现我可以这样做:
before(function(done) {
app.listen(3001, function() { done(); });
});
它在另一个端口上开始测试,但是......整个 server.js 无论如何都会加载,所以它也无论如何都会启动。然后,当它与正在运行的服务器一起触发时,会出现明显的 EADDRINUSE。