0

我使用 Mocha 来测试我的 Node/Express.js 服务,并且我想使用 Grunt 自动化这些服务以针对服务器的测试实例运行(即,相同的配置只是在不同的端口上侦听)。

虽然我可以使用 grunt-contrib-connect 启动一个新的(读取:未配置的)服务器实例,但似乎没有办法利用我现有的包含所有 API 路径、中间件等的 app.js 指令. 我看到了几个选项,但都没有吸引力:

  1. 根据文档和示例——https://github.com/gruntjs/grunt-contrib-connect/blob/master/Gruntfile.js——我可以将所有相关语句从我的配置文件传递到“中间件”选项,但这似乎是尽可能地重新发明轮子的情况。

  2. 另一方面,我可以使用 grunt-exec -- https://github.com/jharding/grunt-exec -- 来启动节点,正常传递配置文件以及环境变量(例如,NODE_ENV=测试),这将导致所述配置文件绑定到不同的端口。不幸的是,这个命令会阻止测试的执行,并且在完成后需要另一个 hack 来关闭它。

因此,所以,我对想法持开放态度!用完整的配置指令自动启动我的节点服务器以便我可以用 grunt 和 mocha 测试它们的最优雅的方法是什么?

4

1 回答 1

2

我们将 app.js 配置为在从测试运行时在不同的端口上启动,以便我们可以让开发服务器同时在其常规端口上运行(使用 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 文件,例如这个测试网站图标服务的文件,如下所示:

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运行它。

于 2013-06-05T04:16:21.887 回答