我使用Mocha来测试我的Node / Express.js服务,并且我想使用Grunt自动执行这些服务以针对服务器的测试实例运行(即,只是在不同端口上侦听相同的配置)。
虽然我可以使用grunt-contrib-connect启动服务器的新(读取:未配置)实例,但似乎没有办法利用包含所有API路径的现有app.js指令,中间件等我看到了几个选项,两者都没有吸引力:
根据文档和示例 - https://github.com/gruntjs/grunt-contrib-connect/blob/master/Gruntfile.js - 我可以将配置文件中的所有相关语句传递给“中间件”选项,但这似乎是一个明显的例子。可以重新发明轮子。
另一方面,我可以使用grunt-exec - https://github.com/jharding/grunt-exec - 启动节点,正常传递配置文件,以及环境变量(例如,NODE_ENV = test)这将导致所述配置文件绑定到不同的端口。不幸的是,这个命令阻止了测试的执行,并且在完成时需要另一个hack来关闭它。
因此,我很开心!使用完整配置指令自动启动节点服务器的最优雅方法是什么,以便我可以使用grunt和mocha来测试它们?
答案 0 :(得分:2)
我们将app.js配置为在从测试运行时在不同的端口上启动,以便我们可以在同一时间保持dev服务器在其常规端口上运行(使用nodemon)。这是我们的代码:
// Start server.
if (process.env.TEST == 'true') {
var port = process.env.PORT || 3500; // Used by Heroku and http on localhost
process.env['PORT'] = process.env.PORT || 4500; // Used by https on localhost
}
else {
var port = process.env.PORT || 3000; // Used by Heroku and http on localhost
process.env['PORT'] = process.env.PORT || 4000; // Used by https on localhost
}
http.createServer(app).listen(port, function () {
console.log("Express server listening on port %d in %s mode", this.address().port, app.settings.env);
});
// Run separate https server if not on heroku
if (process.env.HEROKU != 'true') {
https.createServer(options, app).listen(process.env.PORT, function () {
console.log("Express server listening with https on port %d in %s mode", this.address().port, app.settings.env);
});
};
然后,一个mocha文件,例如测试favicon服务的mocha文件,如下所示:
process.env['TEST'] = 'true'; // Use test database
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0" // Avoids DEPTH_ZERO_SELF_SIGNED_CERT error for self-signed certs
var request = require("request").defaults({ encoding: null });
var crypto = require('crypto');
var fs = require('fs');
var expect = require('expect.js');
var app = require("../../app.js");
var hash = function(file) { crypto.createHash('sha1').update(file).digest('hex') };
describe("Server", function () {
after(function () {
process.env['TEST'] = 'false'; // Stop using test database.
});
describe("Static tests", function () {
it("should serve out the correct favicon", function (done) {
var favicon = fs.readFileSync(__dirname + '/../../../public/img/favicon.ico')
request.get("https://localhost:" + process.env.PORT + "/favicon.ico", function (err, res, body) {
// console.log(res)
expect(res.statusCode).to.be(200);
expect(hash(body)).to.be(hash(favicon));
done();
});
});
});
});
另请注意,虽然grunt是一个很棒的工具,但您可以从package.json脚本部分调用mocha,然后只需npm test
来运行它。