unit-testing - 在 Go 中测试构造函数

标签 unit-testing testing go

如何为我的 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/

相关文章:

python - 为什么要在工厂函数上使用 pytest 工厂作为 fixture ?

c# - 对依赖于请求的 URL 参数的 Controller 属性进行单元测试 (ASP.NET MVC)

testing - 使用 "test: argument expected "选项测试文件时遇到 "-e"

ruby-on-rails - capybara 断言在 Poltergeist 下失败

unit-testing - 如何使用 jest 对 Vue.js 组件中的方法进行单元测试

python - 显式方法参数是个好主意吗? - 惯用的Python

c# - 如何在循环中调用正在运行的 Ranorex 测试?

go - 使用 gqlgen + go gin 自定义错误状态代码

go - 无法安装 Revel(无法识别的导入路径)

go - 如何创建基于日期的时间戳