2014-10-16 12 views
5

फ़ाइल करने के लिए मैं अपने लिए अपने यूनिट परीक्षणों का ख्याल रखने और .lcov फ़ाइल में अपना परीक्षण कवरेज आउटपुट करने की कोशिश कर रहा हूं।नोड (Gulp) process.stdout.write

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); 
}); 

mocha-lcov-reporter कोड यहां पाया जा सकता: https://github.com/StevenLooman/mocha-lcov-reporter/blob/master/lib/lcov.js

यह परिणाम आउटपुट के माध्यम से process.stdout.write()

लेकिन जब मैं एक WriteStream को यह पाइप

यह वही है मैं अब तक किया है मेरे पास निम्न त्रुटि है:

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

मैं 'मोचा-lcov-reporter' से परिचित नहीं हूँ, लेकिन आप साधन किया अपने फ़ाइलें (https://github.com/StevenLooman/mocha-lcov-reporter#usage): 1) jscover या node-jscoverage 2 स्थापित करें) अपने पुस्तकालय को jscover (या नोड-jscoverage) के साथ उपकरण 3) अपने परीक्षण चलाएं अपने वाद्य पुस्तकालय के खिलाफ और आउटपुट को बचाने के लिए – pgreen2

उत्तर

3

ऐसा लगता है कि गल्प-मोचा पूरी तरह स्ट्रीम के माध्यम से सच साबित नहीं हुआ है, वास्तव में ऐसा लगता है कि यह सिर्फ मोचा इंस्टेंस में स्रोत को पाइप करता है और मोचा को यह काम करने देता है।

पहली बात यह है कि मेरे सिर की बात आती है तो बस बैश में एक साधारण रीडायरेक्ट करने के लिए ...

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

बेशक यह सब निर्गम ([00:00:00] के साथ शुरू होगा संबंधित घूंट है कि मान लिया गया 00 होने के साथ वर्तमान प्रणाली का समय)। यदि ऐसा नहीं है तो आप अपनी फ़ाइल के ऊपर और नीचे गल्प आउटपुट के साथ समाप्त हो सकते हैं।

यदि आप अधिक सार्वभौमिक उत्तर की तलाश में हैं (पढ़ना: नोडजेज़ का उपयोग करके) आप process.stdout.write का पुनर्लेखन कर सकते हैं। यह शायद है :(सबसे ज्यादा लेकिन यह काम करेगा। चाल यह है कि आप process.stdout को अन्य स्ट्रीम के रूप में ओवरराइट नहीं कर सकते क्योंकि इसे आंतरिक रूप से गेटर के रूप में लिखा जाता है। हालांकि आप stdout.write फ़ंक्शन को फिर से लिख सकते हैं। वास्तव में मैं बस यह एक परियोजना के लिए किया गया है जिस पर मैं काम कर रहा हूं, इसलिए यदि वे बिल्ड सिस्टम के साथ समस्याएं हैं तो अन्य डेवलपर्स के गलप लॉग की समीक्षा कर सकते हैं।

मैंने नॉनसिंक समाधान के साथ जाने का विकल्प चुना क्योंकि नोडजेस में अन्य सभी चीज़ों के विपरीत , stdout और stderr दोनों अवरुद्ध धाराएं हैं और अतुल्यकालिक कोड पहले की तरह की तरह काम नहीं है इस तकनीक अपने कार्य को खत्म होगा कुछ इस तरह लग रही का उपयोग करना:।

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

मैं एक फाइल करने के लिए मेरी घूंट प्रक्रिया में सब कुछ लॉग इन करने की जरूरत है और यह जो मेरे लिए ठीक काम करता है के साथ समाप्त हो गया:

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); 
};