Gulp, Mocha, не перезагружайте мои исходные файлы

Я пытаюсь получить 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', тесты выполняются, и кажется, что "часы" работают. Если я вношу изменения в один из тестовых файлов, тесты повторяются правильно, учитывая изменения, внесенные в тестовый файл.

Если я вношу изменения в свои исходные файлы, тесты также повторно запускаются, но они НЕ запускаются против обновленной версии исходного файла.

Моя мысль заключается в том, что каким-то образом исходный файл кэшируется, но я не могу найти других, у которых, похоже, была эта проблема или найти решение.

Спасибо, что помогли этому Gulp/Node/новичкам Mocha!

Ответы

Ответ 1

У меня была такая же проблема, но я нашел исправление,

Проблема в том, что require в nodejs кэширует ваши файлы src, когда вы запускаете свои тесты через watch

В моем тестовом файле я использовал следующую функцию для аннулирования кеша файла src вместо замены.

Очевидно, что это может быть опасно, см. ссылку внизу моего сообщения для получения дополнительной информации. Использование только для разработки;)

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

см. здесь для получения дополнительной информации: node.js require() cache - можно сделать недействительным?

Ответ 2

Я не хотел модерировать все свои тесты, поэтому я просто застрял эту функцию до того, как я запустил тестовые файлы трубопроводов в 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);

});