2013-06-05 32 views
0

我使用Mocha测试Node/Express.js服务,并且我想用Grunt自动运行这些服务以对服务器的测试实例运行(即,只在不同的端口上监听的相同配置)。从gruntjs启动node.js(在执行mocha测试之前)

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

  1. 根据文档和例子 - https://github.com/gruntjs/grunt-contrib-connect/blob/master/Gruntfile.js - 我可以通过所有相关报表从我的配置文件复制到“中间件“的选择,但这似乎很清楚重新发明轮子的可能性。另一方面,我可以使用grunt-exec - https://github.com/jharding/grunt-exec - 启动节点,正常传递配置文件,以及环境变量(例如,NODE_ENV = test),这会导致所述配置文件绑定到不同的端口。不幸的是,这个命令阻止了测试的执行,并且在完成时需要另一个黑客来关闭它。

因此,我愿意接受创意!用完整配置指令自动启动节点服务器的最优雅方式是什么,以便我可以用grunt和mocha来测试它们?

回答

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); 
    }); 
}; 

然后,摩卡文件,像这样的一个测试图标的服务,看起来是这样的:

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(); 
      }); 
     }); 
    }); 
}); 

同时还要注意的呼噜声是一个伟大的工具,你可以从package.json脚本部分调用mocha,然后运行npm test来运行它。

+0

如何关闭测试服务器?这是在测试完成时发生,还是只让它运行? – Patrick

+0

当摩卡结束运行时服务器自动停止。请注意,如果您需要手动停止某些功能,则可以使用摩卡咖啡功能。 – dankohn

相关问题