我有一个通过express运行的https服务器,我使用mocha和supertest进行测试。
我的问题是-如果我只运行测试-没问题。如果我尝试运行gruntfile并进行测试,然后再运行express-即使在测试文件中使用了after()与app.close(),我仍会看到许多EADDRINUSE错误。相同的情况也适用于测试任务的监视。
这是我的示例测试:
/* 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();
});
});
});
}());
我知道这些测试距离完美还有很大差距,我刚开始进行适当的软件测试。
所有这些“端口已在使用”都是显而易见的,并且没有一个......会引发任何问题。所有测试都正常工作,服务器也正常工作,但标准输出(stdout)却很疯狂。这种行为远非理想,可能存在许多潜在问题和不稳定性问题。
我的问题是 - 如何摆脱它?
我的想法是:
为测试创建专用服务器,仅使用不同的端口。不幸的是,我不知道如何实现。
对于superagent,如果它没有运行,则制作一些条件来运行服务器,否则将其传递给superagent?
使用其他东西而不是superagent(例如request),但我不确定是否所有cookie和node_tls_reject_unauthorized都会起作用。
正如您所看到的-我在这个主题上挣扎,比答案更多的是问题,并且缺乏足够的经验,不知道该从哪里开始。
我衷心感谢任何帮助。
编辑:
我发现我可以这样做:
before(function(done) {
app.listen(3001, function() { done(); });
});
该测试在另一个端口启动,但整个server.js仍然被加载,因此它也会启动。然后,当与运行服务器一起触发时,显然会出现EADDRINUSE错误。