Node.js 使用Mocha和Grunt在Sails.js中运行功能测试时的竞赛条件

Node.js 使用Mocha和Grunt在Sails.js中运行功能测试时的竞赛条件,node.js,gruntjs,sails.js,mocha.js,functional-testing,Node.js,Gruntjs,Sails.js,Mocha.js,Functional Testing,我使用的是Sails v0.10.x,在运行功能测试时出现问题 test/bootstrap.test.js // force the test environment to 'test' process.env.NODE_ENV = 'test'; var Sails = require('sails'); // use zombie.js as headless browser var Browser = require('zombie'); // Global before hook

我使用的是Sails v0.10.x,在运行功能测试时出现问题

test/bootstrap.test.js

// force the test environment to 'test'
process.env.NODE_ENV = 'test';

var Sails = require('sails');

// use zombie.js as headless browser
var Browser = require('zombie');

// Global before hook
before(function(done) {
  var self = this;
  // Lift Sails and start the server
  Sails.lift({
    log: {
        level: 'error'
    },
  }, function(err, sails) {
    // initialize the browser using the same port as the test application
    self.browser = new Browser({ site: 'http://localhost:1337', debug: false });

    done(err, sails);
  });
});

// Global after hook
after(function(done) {
  Sails.lower(done);
  this.browser.close();
});
问题是Sails.lift会触发运行默认的Grunt任务。此任务所做的一件事是清除公用文件夹,然后跨多个文件夹复制资产

我遇到的问题是,我的功能测试正在运行,而这种复制仍在进行。这意味着,当我的无头浏览器请求静态资源时,会出现大量404错误(以及测试失败)

我猜可能有几种解决办法

  • 添加一个不清除公用文件夹的新闻“sails lift”命令(但这可能会导致在部署后运行测试时出现问题?)
  • 在启动我的无头浏览器之前,在帆升起后添加一个超时(虽然这看起来有点骇人)
  • 某种回调/事件(不确定这是否可行?)

其他人对此问题提出了哪些解决方案?

您可以尝试在生产模式下提升应用程序:

Sails.lift({
  log: {
      level: 'error'
  },
  environment: 'production'
}, function(err, sails) {...}
在生产模式下,帆只有在所有呼噜声任务完成后才能完成提升

如果这不是您可以选择的选项(因为您需要在具有特定设置的不同环境中运行测试),您可以改为侦听
hook:grunt:done
事件,直到收到该事件后才开始测试。您需要为正在运行测试的环境关闭“监视”任务(否则Grunt将永远无法完成!)。这意味着,如果您想“监视”您的开发环境,您需要在不同的环境中运行测试(这是一个好主意)。因此,首先,在任务/register/default.js中:

module.exports = function (grunt) {
  var tasks = ['compileAssets', 'linkAssets'];
  if (process.env.NODE_ENV !== 'test') {tasks.push('watch');}
    grunt.registerTask('default', tasks);
};
然后在你的测试中:

var async = require('async');
async.parallel({
  // Set up a listener for grunt finish
  listenForGrunt: function(cb) {sails.on('hook:grunt:done', cb);},
  // Lift sails
  liftSails: function(cb) {
    Sails.lift({
      log: {
        level: 'error'
      },
    }, function(err, sails) {
      self.browser = new Browser({ site: 'http://localhost:1337', debug: false });
      cb(err, sails);
    });
  }
}, done);
使用
NODE_ENV=test mocha
运行测试,最好在
scripts
下的package.json中,放置:

"test": "NODE_ENV=test mocha"
这样您就可以运行
npm测试了


这将确保
done
在起航和咕噜声结束之前不会被调用

谢谢你的回复,但不幸的是这不起作用。复制仍在进行时,正在触发“完成”。有趣的是——当我测试这个时,我根本无法让它调用“完成”,因为我意识到“监视”任务正在阻止它。更新了我的答案,提供了关于禁用测试“监视”的信息。在我这么做之后,这就像一个符咒。