首先声明一下,我可能正在做一些不应该做的事情。但既然已经深入到这个地步,我还是想要理解为什么会出现这种情况。
我正在使用Mocha测试一些Node.js代码。这段代码使用了Winston日志库,它直接调用process.stdout.write()
和process.stderr.write()
(源码)。它的表现很好;我对它的行为没有任何抱怨。
然而,当我单元测试这个代码时,Mocha测试运行器的输出有时会夹杂着日志输出行,这在一些报告器(如dot
和bdd
)中很丑陋,在其他报告器(xunit
)中则根本无效。我希望阻止这些输出,同时又不修改或子类化Winston,如果可能的话,也不修改应用程序本身。
我得出的结论是一组实用函数,可以暂时将Node内置函数替换为一个空函数,反之亦然:
var stdout_write = process.stdout._write,
stderr_write = process.stderr._write;
function mute() {
process.stderr._write = process.stdout._write = function(chunk, encoding, callback) {
callback();
};
}
function unmute() {
process.stdout._write = stdout_write;
process.stderr._write = stderr_write;
}
在各种测试规范中,在产生不需要的输出的任何调用或断言之前,我直接调用了mute()
,然后在之后直接调用unmute()
。这感觉有点笨拙,但它起作用了 - 运行测试时控制台上没有一个字节的不需要的输出。现在变得有些奇怪!
这是我第一次尝试将输出重定向到文件:
mocha spec_file.js > output.txt
不需要的输出回来了!每一个被发送到标准输出的输出都出现在文件中。添加2>&1
,我也将标准错误写入到了文件中。但是控制台上没有任何输出。为什么测试代码在这两种调用之间表现如此不同呢?我的直觉猜测是Mocha正在进行某种测试,以确定它是否正在写入TTY,但我没有找到明显的更改其写入行为的地方。
另外一个更广泛的问题是,在测试期间有没有任何正确的方法来静音标准输出/标准错误,而不必将所有潜在记录应用程序代码包装在检查测试环境的条件语句中?
write
和_write
,而是创建一个“null”流并完全替换stdout
和stderr
。我也会感到惊讶,如果没有一个“全局设置”来使Winston做到这一点:静音。(即:将日志级别降至最低)。 - Nitzan Shaked