如何在golang中测试io.writer?

17

最近我希望为golang编写单元测试。该函数如下:

func (s *containerStats) Display(w io.Writer) error {
    fmt.Fprintf(w, "%s %s\n", "hello", "world")
    return nil
}

我该如何测试 "func Display" 函数的结果是否为 "hello world"?

1个回答

34
你可以简单地传入自己的io.Writer,并测试写入的内容是否与预期相符。 bytes.Buffer 是这种io.Writer的很好选择,因为它只是将输出存储在其缓冲区中。
func TestDisplay(t *testing.T) {
    s := newContainerStats() // Replace this the appropriate constructor
    var b bytes.Buffer
    if err := s.Display(&b); err != nil {
        t.Fatalf("s.Display() gave error: %s", err)
    }
    got := b.String()
    want := "hello world\n"
    if got != want {
        t.Errorf("s.Display() = %q, want %q", got, want)
    }
}

非常感谢你的帮助!这正是我想要的! - wonderflow
4
这里有一个错别字:在Display调用中,你需要使用&b 或者 b := new(bytes.Buffer),因为Write方法有一个指针接收器。请注意,在Display调用中只需要使用一个选项。 - Dave C
谢谢Dave!我不知道问题可以这么容易地解决。 :) - wonderflow
当我这样做时,String()返回“”。我可以看出写入发生了,因为Len()改变了。由于我将对象作为Writer传递,我不知道谁在读取它。是否有任何方法仍然可以读取缓冲区的内容? - Philippe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接