我正在使用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错误(以及失败的测试)。
我猜可能会有几种解决方案
其他人为此问题提出了哪些解决方案?
答案 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
。