2014-05-12 206 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

我很欣賞你的指導,但我不覺得我最終可以接受這個答案作爲正確的答案,因爲它沒有回答這個問題:提供一種方法來通過一口氣完成任務。 –