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

时间:2014-09-30 10:25:52

标签: node.js gruntjs sails.js mocha functional-testing

我正在使用Sails v0.10.x并在运行我的功能测试时遇到问题。

测试/ 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”命令,该命令不会清除公用文件夹(这可能会导致在部署后运行测试时出现问题?)
  • 在启动无头浏览器之前在风帆抬起后添加超时(虽然这看起来很糟糕)
  • 某种回调/事件(不确定这是可能的吗?)

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

1 个答案:

答案 0 :(得分:1)

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

Sails.lift({
  log: {
      level: 'error'
  },
  environment: 'production'
}, function(err, sails) {...}

在生产模式下,在完成所有Grunt任务之前,Sails不会完成提升。

如果这不是您的选择(因为您需要在具有特定设置的其他环境中运行测试),您可以改为监听hook:grunt:done事件而不是在收到测试之前开始测试。您需要为正在运行测试的环境关闭“监视”任务(否则Grunt将永远不会完成!)。这意味着如果你想继续“监视”你的开发环境,你需要在不同的环境中运行测试(无论如何这都是个好主意)。首先,在 tasks / 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 test

这将确保在Sails解除 Grunt完成之前不会调用done