Catching gulp-mocha errors

Roy Jacobs picture Roy Jacobs · Feb 6, 2014 · Viewed 11k times · Source

I may be missing something extremely obvious but I can't get gulp-mocha to catch errors, causing my gulp watch task to end everytime I have a failing test.

It's a very simple set up:

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

Alternatively, putting the handler on the entire stream also gives the same problem:

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

I've also tried using plumber, combine and gulp-batch to no avail, so I guess I'm overlooking something trivial.

Gist: http://gist.github.com/RoyJacobs/b518ebac117e95ff1457

Answer

Shuhei Kagawa picture Shuhei Kagawa · Feb 10, 2014

You need to ignore 'error' and always emit 'end' to make 'gulp.watch' work.

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

This makes 'gulp test' to always return '0' which is problematic for Continuous Integration, but I think we have no choice at this time.