结构字段恢复

时间:2017-08-25 04:08:58

标签: unit-testing go struct

我正在玩Go,但在做一些测试时发现了这种奇怪的情况。

我在结构中使用方法将变量发送到另一个应该更改字段的方法,但是当我在最后检查它时,字段会回到第一个值,这让我感到困惑。

func (this TVManager) sendMessage(message string) {
    fmt.Println("5", this.connector)
    payload := map[string]string {
       "id": "0",
       "type": "request",
       "uri": "ssap://system.notifications/createToast",
       "payload": "{'message': 'This is a message'}"}
    this.connector.sendCommand(payload)
    fmt.Println("4", this.connector)
}

这是我正在测试的方法,它调用连接器的sendCommand。

func (this MockConnector) sendCommand(payload map[string]string) {
    fmt.Println("0", this)
    this.last_command = payload
    this.value = true
    fmt.Println("0", this)
}

我正在使用的模拟对象中只是改变了这个struct字段的值。

    manager.sendMessage("This is a message")

fmt.Println("1", connector)
assert.Equal(t, expected, connector.last_command, "Command should be equal")

但是当我检查它时,它会回到内部。我设置了一些打印件以尝试跟踪值,并按预期更改值,但随后会恢复。

 1 {false map[]}
 5 {false map[]}
 0 {false map[]}
 0 {true map[uri:ssap://system.notifications/createToast payload:{'message': 'This is a message'} id:0 type:request]}
 4 {false map[]}
 1 {false map[]}
 --- FAIL: TestTVManagerSendsNotificationDownToConnector (0.00s)

这只是一个小程序我要去学习一些Go,所以我感谢任何人都能给我的任何帮助。

1 个答案:

答案 0 :(得分:2)

您按值传递结构。只要您不修改结构,这样就可以正常工作,但如果您修改它,实际上只是修改了一个副本。要完成这项工作,您需要将指针用于需要修改的结构。

而不是:

func (this MockConnector) sendCommand(payload map[string]string)

使用:

func (this *MockConnector) sendCommand(payload map[string]string)

此外,在Go中使用this(或self)作为接收者名称被认为是一个坏主意,因为接收者与this指针不同参考其他语言。

另一个最佳实践是,如果给定类型的一个方法需要指针接收器,则该类型的所有方法都应该具有指针接收器。这样,无论值是否为指针,方法集都保持一致。

有关详细信息,请参阅method setsthese FAQ answers