41

我可能遗漏了一些非常明显的东西,但我无法gulp-mocha捕捉错误,导致gulp watch每次测试失败时我的任务都会结束。

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

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

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

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

4

2 回答 2

67

您需要忽略“错误”并始终发出“结束”以使“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));
});

这使得“gulp test”总是返回“0”,这对于持续集成来说是有问题的,但我认为我们目前别无选择。

于 2014-02-10T13:30:44.677 回答
41

扩展 Shuhei Kagawa 的答案..

由于未捕获的错误被转换为异常,发射端将阻止 gulp 退出。

设置 watch var 来跟踪你是否正在通过 watch 运行测试,然后根据你是开发还是运行 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

于 2014-02-12T17:24:13.030 回答