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



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

测试/引导.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错误(和失败的测试)。

我猜可能有几种解决方案

  • 添加一个不清理公用文件夹的news"sails-lift"命令(不过,这可能会在部署后运行测试时导致问题?)
  • 在帆升起后,在启动我的无头浏览器之前添加一个超时(尽管这看起来很糟糕)
  • 某种回调/事件(不确定这是否可能?)

其他人对此问题有什么解决方案?

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

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

在生产模式下,只有所有Grunt任务完成,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运行测试,或者在包中运行更好。jsonscripts下,放入:

"test": "NODE_ENV=test mocha"

这样你就可以运行npm test了。

这将确保done在Sails提升Grunt完成之前不会被调用。

最新更新