2014-05-12 170 views
12

我有一套gulp.js目标,用于运行我的摩卡测试,其工作方式类似于通过gulp-mocha运行的魅力。问题:我如何调试通过吞咽运行的摩卡测试?我想用node-inspector之类的东西在我的src中设置断点并测试文件以查看发生了什么。我已经能够通过直接调用节点来实现:Gulp:调试摩卡测试的目标

node --debug-brk node_modules/gulp/bin/gulp.js test 

但我更喜欢一饮而尽的目标,它包装这对我来说,例如:

gulp.task('test-debug', 'Run unit tests in debug mode', function (cb) { 
    // todo? 
}); 

想法?我想避免使用bash脚本或其他单独的文件,因为我试图创建一个可重复使用的gulpfile,其目标可由不知道吞咽的人使用。

这是我目前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']); 
}); 
+0

也许使用childprocess.exec? http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback –

+0

@BrianGlaz这是一个好主意。唯一的缺点是,在任务完成之前,您不会从流程中获得输出结果,而不是随时待命。有没有办法做到这一点,同时获得逐步输出到标准输出? –

+0

检出child_process.spawn()http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options。它非常相似,但作为一个事件发射器让你附加回调。检查链接的例子。 –

回答

12

在@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' }); 
    }); 
4

您可以使用节点的Child Process类运行从节点的应用程序中的命令行命令。在你的情况下,我会建议childprocess.spawn()。它充当事件发射器,因此您可以订阅data以检索stdout的输出。从内部使用这个角度来看,可能需要完成一些工作才能返回可以通过管道连接到另一个吞咽任务的流。

+0

我假设你的意思是'childprocess.spawn()'? –

+1

哈哈是的,编辑。 –

+0

我很欣赏你的指导,但我不觉得我最终可以接受这个答案作为正确的答案,因为它没有回答这个问题:提供一种方法来通过一口气完成任务。 –