javascript - Node (Gulp)process.stdout.write 到文件

标签 javascript node.js unit-testing mocha.js gulp

我正在尝试让 gulp 为我处理单元测试,并将我的测试覆盖率输出到 .lcov 文件。

这是我目前所拥有的:

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)

最佳答案

看起来 gulp-mocha 并没有完全设置为真正的直通流,事实上,它看起来只是将源通过管道传输到 Mocha 实例中,然后让 Mocha 执行它。

我想到的第一件事就是在 bash 中做一个简单的重定向...

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

当然,这假设所有与 gulp 相关的输出都以 [00:00:00] 开头(00 是当前系统时间)。如果不是这种情况,您最终可能会在文件的顶部和底部看到 gulp 输出。

如果您正在寻找更通用的答案(阅读:使用 nodejs),您可以重写 process.stdout.write .这可能是 :( 大多数人都这样做,但它会起作用。诀窍是你不能将 process.stdout 覆盖为另一个流,因为它在内部被写为一个 getter。但是你可以重写 stdout.write 函数。作为一个问题事实上,我只是为我正在做的一个项目做了这个,这样我就可以查看其他开发人员的 gulp 日志,以防他们的构建系统出现问题。

我选择了一个不太异步的解决方案,因为与 nodejs 中的大多数其他东西不同,stdoutstderr都是阻塞流,不像你习惯的异步代码。使用这种技术,您的任务最终会看起来像这样:

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

关于javascript - Node (Gulp)process.stdout.write 到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26396947/

相关文章:

javascript - 如何确保在 Node JS 上的 render() 之前执行查询

javascript - 文件更改时 Webpack 开发服务器不会重新编译

java单元测试输入异常

unit-testing - F# - 如何使用 NUnit 正确实现设置和初始化变量

javascript - 使用 html 中的单个按钮上传图像

javascript - 如何将 json POST 数据作为对象传递给 Web API 方法?

Javascript:说明如果 Type(x) 未定义,则返回 true。如果 Type(x) 为 Null,则返回 true

javascript - 使用 ajaxform() 在页面中提交多表单

javascript - Node 表达带有排除项的虚荣 url 路径参数

java - 如何使用 Lucene TestUtil 生成随机 Unicode 字符串