Je manque peut-être quelque chose d'extrêmement évident, mais je ne peux pas obtenir gulp-mocha
pour détecter les erreurs, provoquant mon gulp watch
tâche pour terminer chaque fois que j'ai un test qui échoue.
C'est une configuration très simple:
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));
});
Alternativement, mettre le gestionnaire sur le flux entier pose également le même problème:
gulp.task("test", function() {
return gulp.src(paths.tests)
.pipe(mocha({ reporter: "spec" }))
.on("error", gutil.log);
});
J'ai également essayé d'utiliser plumber
, combine
et gulp-batch
en vain, donc je suppose que je néglige quelque chose de trivial.
Vous devez ignorer "error" et toujours émettre "end" pour que "gulp.watch" fonctionne.
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));
});
Cela fait que "test gulp" renvoie toujours "0", ce qui est problématique pour l'intégration continue, mais je pense que nous n'avons pas le choix pour le moment.
Élargir la réponse de Shuhei Kagawa ..
l'émission de fin empêchera la sortie de gulp en raison de la conversion de l'erreur non capturée en exception.
Définissez une variable de surveillance pour suivre si vous exécutez le test via la montre, puis quittez ou non selon que vous développez ou exécutez 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"]);
});
Cela peut ensuite être utilisé pour le développement et CI