gulp.watch导致“任务完成回调被调用太多次”

时间:2016-07-06 16:21:10

标签: javascript gulp karma-runner gulp-watch gulp-karma

当我更改文件(如HelloWorld.js)时,我想使用Karma运行特定的测试套件(称为HelloWorldSpec.js)。

因此我创建了这个Gulp任务:

gulp.task('dev', function(done) {
  // Watch source code changes
  gulp.watch('src/**/*.js').on('change', function(file) {

    // Assemble path to test file
    var pathObject = path.parse(file.path);
    var specificationPath = 'test/' + pathObject.name + 'Spec.js';

    // Run test file
    new Server({
      configFile: __dirname + '/karma.conf.js',
      files: [
        'dist/**/*.js',
        specificationPath
      ],
      singleRun: true
    }, done).start();
  });
});

我现在遇到的问题是我将done回调传递给Karma服务器,该服务器在每次测试运行后执行它。因此,我在第二个源代码修改(以及每个后续代码)上收到以下错误:

  

错误:任务完成回调调用次数

如果我没有将done回调传递给Server,那么我的Gulp任务会在第一次测试运行后结束。但我想继续关注源代码修改。我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

我也面临同样的问题。我偶然发现了实际有效的linkthis

gulp.task('test', function (done) {
    var server =  new Server({
        configFile: __dirname + '/karma.conf.js',
        singleRun: true
    });

    server.on('browser_error', function (browser, err){
        gutil.log('Karma Run Failed: ' + err.message);
        throw err;
    });

    server.on('run_complete', function (browsers, results){
        if (results.failed) {
            throw new Error('Karma: Tests Failed');
        }
        gutil.log('Karma Run Complete: No Failures');
        done();
    });

    server.start();
});

希望这对你有所帮助!

答案 1 :(得分:0)

我在与gulp-watch同时使用webpack手表时遇到了类似的问题。

这是我的饮酒设置:

gulp.task("javascript", function (done) {
    webpack(webpackConfig, function (err, stats) {
        // logs errors and stats here
        done();
        browserSync.reload();
    });
});

gulp.watch([JS_SOURCE, HTML_VIEWS], ["javascript"]);

我的webpack配置:

module.exports = {
    module: {
        loaders: [
            {
                test: /\.(js|jsx)$/,
                loaders: "babel-loader",
                exclude: /node_modules/,
                options: {
                    presets: ["es2015"]
                }
            }
        ]
    },
    watch: true
};

在webpack配置中删除 watch:true 修复了此问题。