如何测试NewClient
结构的Client
构造函数?
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
,这在测试运行期间会挂起,无论如何,这似乎是一个完全错误的方法......任何建议我如何测试这个构造函数?
答案 0 :(得分:2)
有些代码非常简短,确保测试正确比确保代码本身正确更复杂。 你的构造函数就是这样的代码。
我要做的是要么根本不测试它,要么只是调用它(使用net.Conn
的一些虚拟实现)以确保它在被调用时不会被吸烟(因此称为烟雾测试) )。
稍后您可以将其作为更大测试(集成测试)的一部分进行测试,您可以在其中连接一个真正的服务器,并使用您的客户端结构与之通信。
如果您发现了由此构造函数引起的错误,请先添加一个演示该问题的测试,然后再修复它。然后你将进行测试: - )
测试应检查构造函数是否“按预期工作”。检查client.conn
的值很难检查任何预期的行为,因为未导出的字段的值不是行为。它只检查结构和构造函数是如何实现的,而不是它实现的内容。测试什么,而不是如何。
顺便说一下,你可以在你的客户端中嵌入一个* ReadWriter。
client.buf = bufio.NewReadWriter(...)
答案 1 :(得分:1)
除了@ bjarke-ebert所说的。
Go中没有构造函数,它们只是普通函数。测试它们,就像测试任何其他功能一样。如果某个函数太复杂而无法测试,那么可能有一种方法可以更改设计以使其更易于测试。
另外,根据我的经验测试,检查实施的内部细节太多(如问题中的测试)很难维护,因为它们经常需要更新。