在Go中测试构造函数

时间:2015-12-01 22:34:58

标签: unit-testing testing go

如何测试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,这在测试运行期间会挂起,无论如何,这似乎是一个完全错误的方法......任何建议我如何测试这个构造函数?

2 个答案:

答案 0 :(得分:2)

有些代码非常简短,确保测试正确比确保代码本身正确更复杂。 你的构造函数就是这样的代码。

我要做的是要么根本不测试它,要么只是调用它(使用net.Conn的一些虚拟实现)以确保它在被调用时不会被吸烟(因此称为烟雾测试) )。

稍后您可以将其作为更大测试(集成测试)的一部分进行测试,您可以在其中连接一个真正的服务器,并使用您的客户端结构与之通信。

如果您发现了由此构造函数引起的错误,请先添加一个演示该问题的测试,然后再修复它。然后你将进行测试: - )

测试应检查构造函数是否“按预期工作”。检查client.conn的值很难检查任何预期的行为,因为未导出的字段的值不是行为。它只检查结构和构造函数是如何实现的,而不是它实现的内容。测试什么,而不是如何。

顺便说一下,你可以在你的客户端中嵌入一个* ReadWriter。

client.buf = bufio.NewReadWriter(...)

答案 1 :(得分:1)

除了@ bjarke-ebert所说的。

Go中没有构造函数,它们只是普通函数。测试它们,就像测试任何其他功能一样。如果某个函数太复杂而无法测试,那么可能有一种方法可以更改设计以使其更易于测试。

另外,根据我的经验测试,检查实施的内部细节太多(如问题中的测试)很难维护,因为它们经常需要更新。