首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从gruntjs用完整配置启动node.js (在执行mocha测试之前)

从gruntjs用完整配置启动node.js (在执行mocha测试之前)
EN

Stack Overflow用户
提问于 2013-06-05 02:27:42
回答 1查看 896关注 0票数 0

我使用Mocha来测试我的Node/Express.js服务,我想用Grunt自动化这些服务,以针对服务器的一个测试实例运行这些服务(也就是说,相同的配置只是监听不同的端口)。

虽然我可以使用grunt-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=test),该变量将导致所述配置文件绑定到另一个端口。不幸的是,这个命令阻止了测试的执行,并且需要另一个黑客来关闭它。

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

EN

回答 1

Stack Overflow用户

发布于 2013-06-05 04:16:21

我们将我们的app.js配置为在从测试中运行时在另一个端口上启动,这样我们就可以在它们的常规端口上同时运行开发服务器(使用nodemon)。这是我们的代码:

代码语言:javascript
复制
// 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文件,比如这个测试该图标服务的文件,看起来如下所示:

代码语言:javascript
复制
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来运行它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16930610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档