2014-05-12 6 views
12

Ich habe eine Reihe von gulp.js Ziele für die Ausführung meiner Mokka-Tests, die wie ein Charme durch gulp-mocha laufen. Frage: Wie debugge ich meine Mocha-Tests, die durch Schluck laufen? Ich möchte etwas wie node-inspector verwenden, um Unterbrechungspunkte in meinem src und Testdateien zu setzen, um zu sehen, was vor sich geht. Ich bin bereits in der Lage, dies zu erreichen durch den Knoten Aufruf direkt:Gulp: Ziel zu debuggen Mokka-Tests

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

Aber ich würde einen großen Schluck Ziel bevorzugen, dass das für mich hüllt, z.B .:

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

Ideen? Ich möchte ein bash Skript oder eine andere separate Datei vermeiden, da ich versuche, ein wiederverwendbares gulpfile mit Zielen zu erstellen, die von jemandem verwendet werden können, der Schluck nicht kennt.

Hier ist meine aktuelle 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

vielleicht childprocess.exec benutzen? http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback –

+0

@BrianGlaz das ist eine gute Idee. Der einzige Nachteil besteht darin, dass Sie die Ausgabe des Prozesses erst dann erhalten, wenn die Aufgabe abgeschlossen ist und nicht mehr im Gange ist. Gibt es eine Möglichkeit, dies zu tun, während progressive Ausgabe auf Standard ausgegeben wird? –

+0

Schauen Sie sich child_process.spawn() http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options an. Es ist sehr ähnlich, aber fungiert als Event-Emitter, mit dem Sie Callbacks anhängen können. Überprüfen Sie den Link für Beispiele. –

Antwort

12

Mit etwas Anleitung von @BrianGlaz kam ich auf die folgende Aufgabe. Das ist ziemlich einfach. Außerdem ist es Rohre alle Ausgaben an die Eltern stdout so muss ich nicht stdout.on manuell handhaben:

// 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

können Sie Knotens verwenden Child Process Klasse Kommandozeilenbefehle aus einem Knoten App auszuführen. In Ihrem Fall würde ich childprocess.spawn() empfehlen. Er fungiert als Ereignis-Emitter, so dass Sie data abonnieren können, um die Ausgabe von stdout abzurufen. In Bezug auf die Verwendung dieser aus dem Schluck, einige Arbeit würde wahrscheinlich getan werden müssen, um einen Stream, Pipe an eine andere Schluck-Aufgabe weitergeleitet werden könnte.

+0

Ich nehme an, Sie meinen 'childprocess.spawn()'? –

+1

Haha ja, bearbeitet. –

+0

Ich schätze Ihre Anleitung, aber ich habe nicht das Gefühl, dass ich dies letztendlich als die richtige Antwort akzeptieren kann, da sie die Frage nicht beantwortet: Bereitstellung einer Möglichkeit, dies über eine Schluckaufgabe zu tun. –