Node.js 如何访问摩卡&x27;脚本中的json报告?

Node.js 如何访问摩卡&x27;脚本中的json报告?,node.js,mocha.js,Node.js,Mocha.js,Mocha可以是,它有一个有用的,但是如何从调用脚本访问报告的结构呢?重定向标准输出已工作: var Mocha=require('Mocha'); var stats={}; var oldswrite=process.stdout.write; process.stdout.write=函数(txt){ stats=JSON.parse(txt).stats;//一口气调用write。 }; 新摩卡咖啡()。 addFile(“test/toyTest”)。 报告器(“json”{stats

Mocha可以是,它有一个有用的,但是如何从调用脚本访问报告的结构呢?重定向标准输出已工作:

var Mocha=require('Mocha');
var stats={};
var oldswrite=process.stdout.write;
process.stdout.write=函数(txt){
stats=JSON.parse(txt).stats;//一口气调用write。
};
新摩卡咖啡()。
addFile(“test/toyTest”)。
报告器(“json”{stats:stats})。
运行(功能(故障){
process.on('exit',function(){
process.stdout.write=oldswrite;
log(“百分比:”+stats.passes/(stats.passes+stats.failures));
进程退出(失败>0?1:0);
});
});
但我本来希望有一个更直接的解决方案。

根据,答案是“你不能”:

process.stdout.write(JSON.stringify(obj,null,2))

由于上面的“我的解决方案”不太明显,我创建了一个添加报告器选项以传入目标对象:

var Mocha=require('Mocha');
var报告={};
新摩卡咖啡()。
addFile(“test/toyTest”)。
reporter(“json”,{“输出对象”:report})。
运行(功能(故障){
process.on('exit',function(){
var s=report.stats;
日志(“百分比:”+s.passes/(s.passes+s.failures));
进程退出(失败>0?1:0);
});
});
这节省了捕获process.stdout.write以及报告结构不必要的序列化和反序列化。我还添加了一个命令行来设置输出文件,以便您可以运行:


mocha-rjson--reporter options output file=rpt.json

另一种解决方案是创建您自己的报告器,就像。我只是将
node\u modules/mocha/lib/reporters/json.js
中的json报告器复制到我的项目文件夹
companyReporter.js
中的新文件中,并替换了这一行

Ln 69: process.stdout.write(JSON.stringify(obj, null, 2));

还需要更新myReporter.js的第9行和第10行的requires路径。我更喜欢这种方式,因为我没有弄乱
进程.stdout.write

对代码的最后更改是更新报告器路径:

var Mocha = require('mocha');
process.on('message', function (message) {
    const test = message.toString('utf8').replace(/\n$/,'');
    new Mocha().
        addFile(test).
        reporter(__dirname + '/path/to/myReporter.js').
        run(function(failures) {
            process.exit(failures > 0 ? 1 : 0);
        });
});
var Mocha = require('mocha');
process.on('message', function (message) {
    const test = message.toString('utf8').replace(/\n$/,'');
    new Mocha().
        addFile(test).
        reporter(__dirname + '/path/to/myReporter.js').
        run(function(failures) {
            process.exit(failures > 0 ? 1 : 0);
        });
});