3

我有一个要测试的 MyClass 类。

MyClass 有一个调用内部服务器做某事的 void 方法。

func (d *MyClass) SendToServer(args)
  do stuff....
  server.Send(myMessage)

我想模拟服务器调用 Send,但由于该方法是一个 void 方法,我不能确定我实际上调用它是正确的。

这些是我想到的选项:

  1. 使用 gomock,mock 服务端,对服务的 send 方法设置期望
  2. 创建我自己的 MockServer,并用一堆验证“覆盖”方法 Send。就像是:

func (d *MockedServer) Send(message) // 验证消息...

  1. 创建我自己的 MockServer,但不是在方法中验证期望,而是将消息添加到消息列表中,然后验证列表的内容。

Go 中有什么更好的方法?

4

1 回答 1

2

您可以像这样从您的方法中创建一个函数:

var sendToServer = (*Server).Send

func func (d *MyClass) SendToServer(args) {
    // ...
    sendToServer(server, msg)
    // ...
}

在你的测试中:

func TestMyClass_SendToServer(t *testing.T) {
    // ...
    sent := false
    sendToServer = func(*Server, args) {
        sent = true
    }
    mc.SendToServer(args)
    if !sent {
        t.Error("fail")
    }
}

这在 Andrew Gerrand 的测试技术演讲中有所描述。

于 2015-01-30T10:31:00.917 回答