如何让grunt.js启动一个快速应用程序进行测试

时间:2013-04-07 00:35:33

标签: node.js unit-testing gruntjs

我目前的情况是我使用grunt制作我的快递应用程序的生产版本(最小化并合并所有js / css,复制所有文件到位)然后我必须运行一个设置环境变量的脚本(我的应用程序仅在TEST模式下运行时提供测试工具),创建一个空的Mongo测试数据库,然后在应用程序目录中调用npm start,然后我手动从Chrome或Phantom运行测试,我想要的do是让grunt设置环境变量并运行服务器,运行测试,然后停止服务器(将来如果一切都成功,那么部署它也会很好)。但是,当我尝试在grunt中运行应用程序时,它会在完成后立即停止。

如何让grunt启动应用程序,等到它启动然后再运行测试?

2 个答案:

答案 0 :(得分:11)

如果您通过grunt检查grunt-express哪个是快速网络服务器任务的插件。

  

表达-存活

     

请注意,只要grunt正在运行,此服务器就会运行。一旦   grunt的任务已经完成,Web服务器停止了。这种行为可以   通过在你的结尾添加一个快速保持任务来改变   像这样的任务清单

     

grunt.registerTask('myServer', ['express', 'express-keepalive']);
  现在,当您运行grunt myServer时,您的快速服务器将保持活动状态   直到你手动终止它。

     

此功能也可以通过运行grunt express express-keepalive等任务来临时启用。

     

此设计使您可以灵活地使用grunt-express   与之后立即运行的另一项任务相结合,例如   grunt-contrib-qunit插件qunit任务。如果我们强制表达任务   总是异步,这种用例不再发生。

指南grunt-contrib-qunit包用于在无头PhantomJS实例中运行QUnit单元测试。还要记住最后一行,如果你强制表达总是异步,那就没用了。

对于grunt-express

npm link

答案 1 :(得分:1)

我不确定我是否正确理解你的问题,但这可能会有所帮助:

你知道Grunt的异步功能吗?有一段时间我使用以下方法启动(并停止)我的Express应用程序。我用手表,所以它会在保存时自动重启。在这种情况下,您必须将watch的nospawn选项设置为true。

var server = null;
grunt.registerTask('server', 'Start server', function() {
  var done = this.async();
  if (server !== null) {
    server.close();
    clearCache();
  }
  var app = require('./my-express-app.js');
  server = http.createServer(app).listen(app.get('port'), function(){
    done();
  });
});

function clearCache() {
  for (key in require.cache) {
    if (key.indexOf(__dirname + '/node_modules/') == -1) {
      delete require.cache[key];
    }
  }
}

因为这个需要缓存黑客而丑陋。但是,它有效。