我使用的是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
运行测试,或者在包中运行更好。json在scripts
下,放入:
"test": "NODE_ENV=test mocha"
这样你就可以运行npm test
了。
这将确保done
在Sails提升和Grunt完成之前不会被调用。