gpt4 book ai didi

unit-testing - 如何在 Golang 中模拟结构方法

转载 作者:数据小太阳 更新时间:2023-10-29 03:34:41 24 4
gpt4 key购买 nike

我正在阅读这个页面(我没有使用亚马逊,只是为了 golang 教育而阅读)

https://aws.amazon.com/blogs/developer/mocking-out-then-aws-sdk-for-go-for-unit-testing/

当我自己尝试时,我遇到了类型错误。

type Queue struct {
Client ThirdPartyStruct
URL string
}

type mockedReceiveMsgs struct {
ThirdPartyStruct
Resp ValueIWantToMock
}

q := Queue{Client: mockedReceiveMsgs{}}

当我尝试做完全相同的事情时,我得到了

cannot use mocked literal (type mockedReceiveMsgs) as type ThirdPartyStruct in field value

我觉得我在完全复制亚马逊教程。怎么会有代码,mockedReceiveMsgs 可以用来代替 ThirdPartyStruct?

最佳答案

问题不在于模拟,而在于 Queue 结构按值(作为子结构)而不是指针包含 ThirdPartyStruct。 mockedReceiveMsgs 也是如此。碰巧在 Queue 结构中这个子结构可以通过 Client 名称访问,而在 mockedReceiveMsgs 中它应该是“匿名的”(但实际上如果需要可以通过 ThirdPartyStruct 名称引用)。

所以,q := Queue{Client: mockedReceiveMsgs{}} 实际上试图将 mockedReceiveMsgs 复制到 Client 中,但显然失败了,因为它有额外的位,不适合 ThirdPartyStruct。您可以通过将其更改为 q := Queue{Client: mockedReceiveMsgs{}.ThirdPartyStruct} 来编译它,尽管我怀疑这是您想要的。

请注意,如果您将 Client ThirdPartyStruct 更改为 Client interface{}(在您的原始示例中),那么它也会编译。这很可能是您想要的。它也适用于任何接口(interface)类型。 @tkausl 最有可能指出的是这一点。当您实现接口(interface)时,唯一棘手的一点是指针语义与值语义。它有时会适得其反。查看快速示例 here

关于unit-testing - 如何在 Golang 中模拟结构方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48179565/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com