如何检查是否已写入stdout?

时间:2015-10-17 18:15:12

标签: go

我正在尝试测试一个能否使用" os"打印到stdout的函数。 package的stdout变量,实际打印到stdout。我运行这个功能,我发现它确实打印到stdout。现在我想弄清楚如何使用golang代码证明此函数打印到stdout。我可以使用" os" package的stdout变量,用于检查在调用数组中的一个函数后是否已写入stdout?

我试图通过调用os.stdout变量上的Stat()方法来判断是否已写入stdout,以便能够访问stdout的大小和上次修改时间,但是大小和上次修改时间确实如此没有反映函数写入stdout的事实。

1 个答案:

答案 0 :(得分:1)

在我看来,处理这个问题的正确方法是让代码以某种方式将io.Writer作为参数,而不是直接使用stdout。你真的应该避免打印到stdout而没有更高级代码重定向它的方法。几乎所有的stdlib都采用这种方法。很少有stdlib默认写入stdout,并且大多数地方都有一个更通用的形式,它需要一个Writer。例如,fmt.Printf is simply a convenience function for fmt.Fprintf.

话虽如此,你可以嘲笑stdout。如果您的代码正在推送到stdout,那么您需要做的就是为stdout创建一个全局变量并改为写入。这是在stdlib测试中完成的,以模拟time.Now()。而不是使用time.Now,他们使用包全局now()并根据是否正在运行测试来设置它。

作为最后的手段,假设前两个事情是不可能的,你可以复制当前的os.Stdout并用os.Pipe替换它。然后你需要另一个goroutine来监听那个管道并报告返回的内容。