web-dev-qa-db-ja.com

gulp-mochaエラーをキャッチする

非常に明白なものがない場合がありますが、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);
});

plumbercombine、およびgulp-batchを使用しても役に立たないので、些細なことを見落としているようです。

要旨: http://Gist.github.com/RoyJacobs/b518ebac117e95ff1457

39
Roy Jacobs

「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」を返すようになり、継続的インテグレーションでは問題になりますが、現時点では選択肢がないと思います。

66
Shuhei Kagawa

香川周平の答えをさらに詳しく。

終了を放出すると、キャッチされていないエラーが例外に変換されるためにgulpが終了するのを防ぎます。

監視変数を設定して、監視を通じてテストを実行しているかどうかを追跡し、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に使用できます

41
abovethewater