Gulp、Mocha和Watch没有重新加载我的源文件

14

我正在尝试使用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 新手!

你的设置看起来很好。你确定你的测试需要你编辑过的文件(而不是它的副本)吗? - Fabrício Matté
是的,测试需要正确的文件。记住,当我运行“gulp unit”而没有“watch”时,它工作得很好。当我使用mocha CLI运行测试时,也能够正常运行。只有在测试自动重新运行因为“watch”看到我的源文件发生了变化时,它似乎出现了(源文件似乎被缓存)。 - Kevin
我遇到了完全相同的问题(但是是Jasmine,而不是Mocha),有解决方案吗? - Karl Glaser
我还没有找到解决方案。目前我没有使用watch。不得不实际完成一些工作! :-) - Kevin
我刚试了一下,没有遇到任何问题。我设置了我的gulp.watch,一切看起来都很好,然后我删除了一个源文件的内容,结果这些测试失败了。我错过了什么吗? - Josh C.
2个回答

7
我遇到了同样的问题,但我找到了一个解决方法。
问题在于当您通过watch运行测试时,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 - 模块测试.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();
    ...

更多信息请参见:node.js require()缓存 - 是否可以使其失效?


谢谢!我也一直在思考这个问题。虽然我还没有测试过这种方法,但它看起来是有效的。此外,我也考虑过在所有测试之前以某种方式使所有模块失效。我也没有测试过这种方法。无论如何,你的答案都能解决这个问题。再次感谢! - Kevin

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);

});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接