2014-10-16 4 views
5

Ich versuche zu Schluck kümmern meine Unit-Tests für mich, und Ausgabe meiner Testabdeckung auf eine .lcov Datei.Node (Gulp) process.stdout.write zu Datei

Das ist, was ich bisher habe: https://github.com/StevenLooman/mocha-lcov-reporter/blob/master/lib/lcov.js

Es gibt Ergebnisse durch process.stdout.write()

diese

Aber wenn ich Rohr zu einem WriteStream:

gulp.task('test', function() { 
    var test = fs.createWriteStream('./test.lcov', {flags: 'a'}); 
    return gulp.src('./assets/js/test/test.js', {read: false}) 
     .pipe(mocha({reporter: 'mocha-lcov-reporter'})) 
     .pipe(test); 
}); 

Der mocha-lcov-reporter Code finden Sie hier Ich habe den folgenden Fehler:

TypeError: Invalid non-string/buffer chunk 
    at validChunk (_stream_writable.js:152:14) 
    at WriteStream.Writable.write (_stream_writable.js:181:12) 
    at Stream.ondata (stream.js:51:26) 
    at Stream.emit (events.js:95:17) 
    at drain (/Users/braunromain/Documents/dev/should-i-go/node_modules/gulp-mocha/node_modules/through/index.js:36:16) 
    at Stream.stream.queue.stream.push (/Users/braunromain/Documents/dev/should-i-go/node_modules/gulp-mocha/node_modules/through/index.js:45:5) 
    at Stream.stream (/Users/braunromain/Documents/dev/should-i-go/node_modules/gulp-mocha/index.js:27:8) 
    at Stream.stream.write (/Users/braunromain/Documents/dev/should-i-go/node_modules/gulp-mocha/node_modules/through/index.js:26:11) 
    at write (/Users/braunromain/Documents/dev/should-i-go/node_modules/gulp/node_modules/vinyl-fs/node_modules/through2/node_modules/readable-stream/lib/_stream_readable.js:623:24) 
    at flow (/Users/braunromain/Documents/dev/should-i-go/node_modules/gulp/node_modules/vinyl-fs/node_modules/through2/node_modules/readable-stream/lib/_stream_readable.js:632:7) 
+0

Ich bin nicht vertraut mit 'Mokka-lcov-reporter', aber wussten Sie Instrument, um Ihre Dateien (https://github.com/StevenLooman/mocha-lcov-reporter#usage): 1) Installieren Sie jscover oder node-jscoverage 2) Instrumentieren Sie Ihre Bibliothek mit jscover (oder node-jscoverage) 3) Führen Sie Ihre Tests gegen Ihre instrumentierte Bibliothek und speichern Sie die Ausgabe – pgreen2

Antwort

3

Sieht so aus, als ob gulp-mocha nicht vollständig als echter "through-stream" eingerichtet ist. Es sieht so aus, als ob es nur die Quelle in eine Mocha-Instanz pipettiert und Mocha seine Sache machen lässt.

Das erste, was gerade an den Kopf kommt eine einfache Umleitung in bash zu tun ...

$ gulp test | grep -Ev "^\[[0-9:]{0,8}\]" > ./test.lcov 

Natürlich ist diese ganze Ausgang nimmt, die schluck beginnt mit [00:00:00] verwandt ist (mit der 00 sein die aktuelle Systemzeit). Wenn dies nicht der Fall ist, können Sie am oberen und unteren Rand Ihrer Datei eine Schluckausgabe sehen.

Wenn Sie eine universellere Antwort suchen (lesen Sie: mit nodejs), können Sie process.stdout.write umschreiben. Das ist wahrscheinlich :(auf die meisten, aber es würde funktionieren. Der Trick ist, dass Sie process.stdout nicht als einen anderen Stream überschreiben können, weil es intern als Getter geschrieben wird. Sie können jedoch die stdout.write Funktion neu schreiben. In der Tat, ich gerade tat dies für ein Projekt, an dem ich arbeite, damit ich Schluckprotokolle anderer Entwickler überprüfen kann, falls sie Probleme mit dem Buildsystem haben , stdout und stderr sind beide Blockierströme und wirken nicht wie der asynchronen Code, den Sie gewohnt sind Mit dieser Technik Ihre Aufgabe so etwas wie dieses würde am Ende der Suche.

gulp.task('test', function() { 
    // clear out old coverage file 
    fs.writeFileSync('./test.lcov', ''); 

    // if you still want to see output in the console 
    // you need a copy of the original write function 
    var ogWrite = process.stdout.write; 

    process.stdout.write = function(chunk){ 
    fs.appendFile('./test.lcov', chunk); 

    // this will write the output to the console 
    ogWrite.apply(this, arguments); 
    }; 

    return gulp.src('./assets/js/test/test.js', {read: false}) 
    .pipe(mocha({reporter: 'mocha-lcov-reporter'})); 
}); 
0

Ich brauchte alles in meinem schluck Prozess in einer Datei zu protokollieren und endete damit auf die für mich ok funktioniert:

var fs = require('fs'); 
var proc = require('process'); 
var origstdout = process.stdout.write, 
    origstderr = process.stderr.write, 
    outfile = 'node_output.log', 
    errfile = 'node_error.log'; 
if (fs.exists(outfile)) { fs.unlink(outfile); } 
if (fs.exists(errfile)) { fs.unlink(errfile); } 

process.stdout.write = function(chunk){ 
    fs.appendFile(outfile, chunk.replace(/\x1b\[[0-9;]*m/g, '')); 
    origstdout.apply(this, arguments); 
}; 

process.stderr.write = function(chunk){ 
    fs.appendFile(errfile, chunk.replace(/\x1b\[[0-9;]*m/g, '')); 
    origstderr.apply(this, arguments); 
};