Gulp: цель для отладки тестов mocha
У меня есть набор gulp.js целей для запуска моих мокко-тестов, которые работают как прелесть, проходящая через gulp-mocha. Вопрос: как мне отлаживать мои тесты мокки через gulp? Я хотел бы использовать что-то вроде node-inspector, чтобы установить точки останова в моих файлах src и test, чтобы узнать, что происходит. Я уже смог выполнить это, позвонив непосредственно node:
node --debug-brk node_modules/gulp/bin/gulp.js test
Но я бы предпочел цель gulp, которая обертывает это для меня, например:
gulp.task('test-debug', 'Run unit tests in debug mode', function (cb) {
// todo?
});
Идеи? Я хочу избежать bash
script или какого-либо другого отдельного файла, так как я пытаюсь создать повторно используемый gulpfile
с целевыми объектами, которые могут использоваться кем-то, кто не знает gulp.
Вот мой текущий gulpfile.js
// gulpfile.js
var gulp = require('gulp'),
mocha = require('gulp-mocha'),
gutil = require('gulp-util'),
help = require('gulp-help');
help(gulp); // add help messages to targets
var exitCode = 0;
// kill process on failure
process.on('exit', function () {
process.nextTick(function () {
var msg = "gulp '" + gulp.seq + "' failed";
console.log(gutil.colors.red(msg));
process.exit(exitCode);
});
});
function testErrorHandler(err) {
gutil.beep();
gutil.log(err.message);
exitCode = 1;
}
gulp.task('test', 'Run unit tests and exit on failure', function () {
return gulp.src('./lib/*/test/**/*.js')
.pipe(mocha({
reporter: 'dot'
}))
.on('error', function (err) {
testErrorHandler(err);
process.emit('exit');
});
});
gulp.task('test-watch', 'Run unit tests', function (cb) {
return gulp.src('./lib/*/test/**/*.js')
.pipe(mocha({
reporter: 'min',
G: true
}))
.on('error', testErrorHandler);
});
gulp.task('watch', 'Watch files and run tests on change', function () {
gulp.watch('./lib/**/*.js', ['test-watch']);
});
Ответы
Ответ 1
С некоторыми рекомендациями от @BrianGlaz я придумал следующую задачу. Концы заканчиваются довольно просто. Кроме того, он передает все выходные данные родительскому stdout
, поэтому мне не нужно вручную обрабатывать stdout.on
:
// Run all unit tests in debug mode
gulp.task('test-debug', function () {
var spawn = require('child_process').spawn;
spawn('node', [
'--debug-brk',
path.join(__dirname, 'node_modules/gulp/bin/gulp.js'),
'test'
], { stdio: 'inherit' });
});
Ответ 2
Вы можете использовать класс Node Child Process
для запуска команд командной строки из приложения Node. В вашем случае я бы рекомендовал childprocess.spawn(). Он действует как эмитент событий, поэтому вы можете подписаться на data
для получения вывода из stdout
. С точки зрения использования этого из gulp, возможно, потребуется какая-то работа для возврата потока, который может быть передан в другую задачу gulp.