我试图每次保存一些文件时都运行测试。这是gulp watch :

gulp.task('jasmine', function() {
 gulp.src('spec/nodejs/*Spec.js')
  .pipe(jasmine({verbose:true, includeStackTrace: true}));
});
gulp.task('watch', function () {
  gulp.watch(['app/*.js', 'app/!(embed)**/*.js','spec/nodejs/*.js'], ['jasmine']);
});

为了测试示例app/maps.js,我正在创建一个spec/nodejs/mapsSpec.js文件,如下所示:
'use strict';
var maps = require('../../app/maps');
describe('/maps related routes', function(){
  it('should ...', function(){...}
...

如果我更改规范文件,则一切工作正常,如果我修改app/maps.js文件,则更改将触发测试。如果我再次对其进行修改,则测试会失败,但是修改不会生效。例如,如果我第二次添加console.log('foo'),则在重新启动gulp watch并再次保存之前,我将看不到它。因此,与gulp.watch一起使用时,只能运行一次 Jasmine 。

我猜这是因为在gulp进程中require是由nodejs缓存的。那我该怎么办?

最佳答案

我看了一下 Jasmine 的代码。问题在于,缓存中唯一的文件是Specs.js文件。子级(需要测试的文件)的缓存不会清除。

在gulp-jasmine的index.js中,有一行删除了缓存:

delete require.cache[require.resolve(path.resolve(file.path))];

如果将下一个代码块放在删除之前,则将删除所有子级缓存,并在每次保存文件后正确运行。
var files = require.cache[require.resolve(path.resolve(file.path))];
if( typeof files !== 'undefined' ) {
    for( var i in files.children ) {
        delete require.cache[ files.children[i].id ];
    }
}

您可以在node_modules中进行更改。
我将请求拉取,所以也许在不久的将来这将永久解决。

还写了一篇关于它的文章:http://navelpluisje.nl/entry/fix-cache-problem-jasmine-tests-with-gulp

10-07 19:35
查看更多