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