Node.js 使用Mocha和Grunt在Sails.js中运行功能测试时的竞赛条件
我使用的是Sails v0.10.x,在运行功能测试时出现问题 test/bootstrap.test.jsNode.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
// 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
在起航和咕噜声结束之前不会被调用 谢谢你的回复,但不幸的是这不起作用。复制仍在进行时,正在触发“完成”。有趣的是——当我测试这个时,我根本无法让它调用“完成”,因为我意识到“监视”任务正在阻止它。更新了我的答案,提供了关于禁用测试“监视”的信息。在我这么做之后,这就像一个符咒。