5

每次我保存一些文件时,我都试图让我的测试运行。这是吞咽手表:

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 过程中 nodejs 缓存了 require 。那我该怎么办?

4

2 回答 2

4

我看了一下gulp-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

于 2014-06-03T18:03:25.040 回答
1

我还没有找到解决此问题的方法,但您可以通过 gulp-shell 任务解决它。

npm install gulp-shell --save-dev

然后

var shell = require('gulp-shell');
...
gulp.task('jasmine', function() {
 gulp.src('spec/nodejs/*Spec.js')
  .pipe(shell('minijasminenode spec/*Spec.js'));
});

您还需要安装 jasmine 作为直接依赖项(gulp-jasmine 使用 minijasminenode)

于 2014-05-03T21:57:35.127 回答