如何为我的 Client
结构测试我的 NewClient
构造函数?
package busybus
import (
"bufio"
"net"
)
type Client struct {
counter integer
conn net.Conn
bufin *bufio.Reader
bufout *bufio.Writer
messages chan string
state string
}
func NewClient(conn net.Conn, messages chan string) *Client {
return &Client{
counter: 0,
conn: conn,
bufin: bufio.NewReader(conn),
bufout: bufio.NewWriter(conn),
messages: messages,
state: "waiting",
}
}
我试过这样的测试:
package busybus
import (
"net"
"testing"
)
func TestNewClient(t *testing.T) {
ln, _ := net.Listen("tcp", ":65535")
conn, _ := ln.Accept()
messages := make(chan string)
client := NewClient(conn, messages)
if client.conn != conn {
t.Errorf("NewClient(%q, %q).conn == %q, want %q", conn, messages, client.conn, conn)
}
}
但由于 ln.Accept
,这在测试运行期间挂起,无论如何这似乎是一个完全错误的方法...有什么建议可以测试这个构造函数吗?
最佳答案
有些代码如此简短,以至于确保测试正确比确保代码本身正确更复杂。 你的构造函数就是这样的代码。
我会做的是根本不测试它,或者只是调用它(使用 net.Conn
的一些虚拟实现)以确保它在调用时不会冒烟(因此称为冒烟测试)。
稍后您可以将其作为更大测试(集成测试)的一部分进行测试,在该测试中您可以连接到一个真实的服务器,并使用您的客户端结构与其通信。
如果您发现此构造函数导致的错误,请先添加一个演示问题的测试,然后修复它。然后你将进行测试:-)
测试应该检查构造函数是否“按预期工作”。检查 client.conn
的值几乎不会检查任何预期的行为,因为未导出字段的值不是行为。它只是检查结构和构造函数是如何实现的,而不是它实现了什么。测试什么,而不是如何。
顺便说一下,您可以在您的客户端中嵌入一个 *ReadWriter。
client.buf = bufio.NewReadWriter(...)
关于unit-testing - 在 Go 中测试构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34031510/