抓住一口气 – 摩卡的错误

我可能会错过一些非常明显的东西,但我不能得到gulp-mocha来捕捉错误,导致我的gulp watch任务结束每次我有一个失败的testing。

这是一个非常简单的设置:

 gulp.task("watch", ["build"], function () { gulp.watch([paths.scripts, paths.tests], ["test"]); }); gulp.task("test", function() { return gulp.src(paths.tests) .pipe(mocha({ reporter: "spec" }).on("error", gutil.log)); }); 

或者,将处理程序放在整个stream上也会产生同样的问题:

 gulp.task("test", function() { return gulp.src(paths.tests) .pipe(mocha({ reporter: "spec" })) .on("error", gutil.log); }); 

我也尝试过使用plumbercombinegulp-batch无济于事,所以我想我忽略了一些微不足道的东西。

要点: http : //gist.github.com/RoyJacobs/b518ebac117e95ff1457

您需要忽略“错误”,并始终发出“结束”,使“gulp.watch”工作。

 function handleError(err) { console.log(err.toString()); this.emit('end'); } gulp.task("test", function() { return gulp.src(paths.tests) .pipe(mocha({ reporter: "spec" }) .on("error", handleError)); }); 

这使得“吞噬testing”始终返回“0”,这对持续集成是有问题的,但是我认为我们目前没有select。

扩展香川Shuhei的答案..

发射端将防止由于未捕获的错误转化为exception而导致吞咽。

设置一个监视variables来跟踪您是否正在运行testing,然后退出或不运行,具体取决于您是在开发还是在运行CI。

 var watching = false; function onError(err) { console.log(err.toString()); if (watching) { this.emit('end'); } else { // if you want to be really specific process.exit(1); } } gulp.task("test", function() { return gulp.src(paths.tests) .pipe(mocha({ reporter: "spec" }).on("error", onError)); }); gulp.task("watch", ["build"], function () { watching = true; gulp.watch([paths.tests], ["test"]); }); 

这可以用于开发和CI