非常に明白なものがない場合がありますが、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);
});
plumber
、combine
、およびgulp-batch
を使用しても役に立たないので、些細なことを見落としているようです。
「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」を返すようになり、継続的インテグレーションでは問題になりますが、現時点では選択肢がないと思います。
香川周平の答えをさらに詳しく。
終了を放出すると、キャッチされていないエラーが例外に変換されるために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に使用できます