我正试图让gulp工作以帮助自动化一些单元测试。我有以下gulp文件。
var gulp = require('gulp'),
mocha = require('gulp-mocha');
gulp.task('unit', function() {
return gulp.src('test/unit/**/*.js')
.pipe(mocha({ reporter: 'spec' }))
.on('error', handleError);
});
gulp.task('watch', function() {
gulp.watch(['src/**/*.js', 'test/unit/**/*.js'], ['unit']);
});
gulp.task('test', ['unit', 'watch']);
当我运行'gulp unit'时,测试运行正常。
当我运行'gulp test'时,测试运行,看起来'watch'正在运行。如果我对其中一个测试文件进行了更改,则测试会重新运行,并考虑到我在测试文件中所做的更改。
如果我对源文件进行了更改,测试也会重新运行,但它们不会针对源文件的更新版本运行。
我的想法是,不知何故,源文件正在被缓存,但我找不到任何其他似乎遇到此问题或找到解决方案的人。
感谢您帮助这个Gulp / Node / Mocha新手!
答案 0 :(得分:7)
我有同样的问题,但我找到了解决方法,
问题是当你通过监视运行测试时,nodejs中的require会缓存你的src文件
我在我的测试文件中使用了以下函数来使src文件的缓存无效,替换为require。
显然这样做可能很危险,请参阅帖子底部的链接以获取更多信息。仅限开发使用;)
Coffeescript - module-test.coffee
nocache = (module) ->
delete require.cache[require.resolve(module)]
return require(module)
Module = nocache("../module")
describe "Module Test Suite", () ->
newModule = new Module();
...
Javascript - module-test.js
var Module, nocache;
nocache = function(module) {
delete require.cache[require.resolve(module)];
return require(module);
};
Module = nocache("../src/module");
describe("Module Test Suite", function () {
newModule = new Module();
...
答案 1 :(得分:1)
我不想修改所有测试,所以我在开始将测试文件传输到mocha之前就把这个函数搞砸了:
function freshFiles(chunk, enc, cb){
_.forOwn(require.cache, function(value, key){
if (key.indexOf('lib') !== -1 && key.indexOf('node_modules')===-1){
delete require.cache[key];
}
});
}
这是我的lib文件夹,但在node_modules路径中没有任何内容。
在gulp看起来像:
gulp.task('test', function () {
var mocha = require("gulp-mocha");
freshFiles();
gulp.src(testSources)
.pipe(mocha({ reporter: 'spec', growl: 'true' }))
.on('error', gutil.log);
});