Jestjs 在测试中加载模块时,如何使用Jest测试pino调试日志是否写入标准输出?

Jestjs 在测试中加载模块时,如何使用Jest测试pino调试日志是否写入标准输出?,jestjs,Jestjs,我将用作记录器,输出发送到标准输出目的地。我正在尝试测试调试消息是否写入标准输出,但在测试中看不到写入process.stdout的任何内容…有人可以帮助吗 引脚记录器 “严格使用” 常数pino=require('pino') const log=pino({name:'TensorFlow with filtering And MQTT',level:'debug'},pino.destination(1)) module.exports={ 父记录器:日志 } 正在测试的代码 const

我将用作记录器,输出发送到标准输出目的地。我正在尝试测试调试消息是否写入标准输出,但在测试中看不到写入process.stdout的任何内容…有人可以帮助吗

引脚记录器

“严格使用”
常数pino=require('pino')
const log=pino({name:'TensorFlow with filtering And MQTT',level:'debug'},pino.destination(1))
module.exports={
父记录器:日志
}
正在测试的代码

const{parentLogger,Process}=require('./libs/utils/src')
const log=parentLogger.child({module:'child_process'})
/**生成进程的主要函数在这里*/
/** 
希望测试承诺是否已解析,并且在解析时调试消息是否写入标准输出。
在VSCode中,它正在命中then块中的断点,并且可以看到它已解析
但下面的测试失败了
**/
main()
.然后(()=>{
调试('notify.js进程已完成初始化')
})
.catch((错误)=>{
log.error(`notify.js进程初始化失败:=${error}`)
})
当前笑话测试

test.only('main函数解析承诺并记录调试消息',()=>{
常量args=[
“节点”,
'notify.js',
`mqtts://${global.config.user}:${global.config.user}@${global.config.host}:8883`,
`${uu dirname}/./../docker/certs/localCA.crt`,
5000,
“假”
]
/**pino logger写入标准输出-尝试检查写入标准输出流的内容**/
让日志=“”
process.stdout.\u orig\u write=process.stdout.write
process.stdout.write=(数据)=>{
记录=记录+数据
进程。标准输出。原始写入(数据)
}
const oldArgs=process.argv
process.argv=args
const notify=require(“../../../src/notify”)
试一试{
expect(logged).toEqual('notify.js process finished initialization')
}最后{
process.argv=oldArgs
process.stdout.write=process.stdout.\u orig\u write
}
})

pino.destination
在上实现,此库正在管理流。看

不知何故,它是在你的应用程序
进程中运行的。stdout
,因此替换
write
函数不会捕获stdout日志

您可以通过替换SonicBoom stream
write
来访问它,这可以从记录器访问。如果您可以公开您的
日志
,以便将其导入到测试文件中-您可以这样使用它:

解决方案
/*导入日志。最好在另一个文件中定义它,然后导入到main和test*/
const{log}=require('../../../src/notify');
//导入流符号
const{streamSym}=require('pino/lib/symbols');
test.only('main函数解析承诺并记录调试消息',()=>{
常量args=[
“节点”,
'notify.js',
`mqtts://${global.config.user}:${global.config.user}@${global.config.host}:8883`,
`${uu dirname}/./../docker/certs/localCA.crt`,
5000,
“假”
]
让日志=“”
log[streamSym]。\u orig\u write=log[streamSym]。write
process.stdout.write=(数据)=>{
记录=记录+数据
进程。标准输出。原始写入(数据)
}
const oldArgs=process.argv
process.argv=args
const notify=require(“../../../src/notify”)
试一试{
expect(logged).toEqual('notify.js process finished initialization')
}最后{
process.argv=oldArgs
log[streamSym].write=log[streamSym]。\u orig\u write
}
})
间谍版本 更好的方法是使用jest.spyOn:

/*导入日志。最好在另一个文件中定义它,然后导入到main和test*/
const{log}=require('../../../src/notify');
//导入流符号
const{streamSym}=require('pino/lib/symbols');
让stdoutSpy,oldArgs;
常量args=[
“节点”,
'notify.js',
`mqtts://${global.config.user}:${global.config.user}@${global.config.host}:8883`,
`${uu dirname}/./../docker/certs/localCA.crt`,
5000,
“假”
];
以前(()=>{
stdoutSpy=jest.spyOn(log[streamSym],'write');
oldArgs=process.argv
process.argv=args
})
毕竟(()=>{
process.argv=oldArgs
stdoutSpy.mockRestore();
})
test.only('main函数解析承诺并记录调试消息',()=>{
const notify=require(“../../../src/notify”)
expect(stdoutSpy).toHaveBeenCalledWith('notify.js process finished initialization');
})

pino.destination
在上实现,此库正在管理流。看

不知何故,它是在你的应用程序
进程中运行的。stdout
,因此替换
write
函数不会捕获stdout日志

您可以通过替换SonicBoom stream
write
来访问它,这可以从记录器访问。如果您可以公开您的
日志
,以便将其导入到测试文件中-您可以这样使用它:

解决方案
/*导入日志。最好在另一个文件中定义它,然后导入到main和test*/
const{log}=require('../../../src/notify');
//导入流符号
const{streamSym}=require('pino/lib/symbols');
test.only('main函数解析承诺并记录调试消息',()=>{
常量args=[
“节点”,
'notify.js',
`mqtts://${global.config.user}:${global.config.user}@${global.config.host}:8883`,
`${uu dirname}/./../docker/certs/localCA.crt`,
5000,
“假”
]
让日志=“”
log[streamSym]。\u orig\u write=log[streamSym]。write
process.stdout.write=(数据)=>{
记录=记录+数据
进程。标准输出。原始写入(数据)
}
const oldArgs=process.argv
process.argv=args
const notify=require(“../../../src/notify”)
试一试{
expect(logged).toEqual('notify.js process finished initialization')
}最后{
process.argv=oldArgs
log[streamSym].write=log[streamSym]。\u orig\u write
}
})