OStack程序员社区-中国程序员成长平台

标题: unit-testing - Go 中的模拟接收器功能 [打印本页]

作者: 菜鸟教程小白    时间: 2022-8-16 02:59
标题: unit-testing - Go 中的模拟接收器功能

我正在尝试对调用该结构中的其他接收器函数的接收器函数进行单元测试。

假设我想测试 Three() 并在下面模拟对 two() 的调用:

type MyStruct struct {
    a string
    b string
}

func (m *MyStruct) one() int {
    return 2
}

func (m *MyStruct) two() int {
    return m.one() * 2
}

func (m *MyStruct) Three() int {
    return m.two() * 2
}

我正在遵循以下方法二 answer .

我为每个想要单元测试的函数创建了一个自定义构造函数,并使用模拟版本覆盖这些方法。但我认为一旦函数数量增加,维护代码可能并不容易。

是否有任何首选方式来模拟此类功能?我希望官方文档有一些关于如何在不同场景中模拟事物的指南,类似于 Python 上的 mox 提供的内容。

另外,请注意,我不想使用第三方模拟库。



Best Answer-推荐答案


这是一种非常不习惯的方式来测试你的东西。
其他语言可能需要所有这些模拟,但是
请不要在 Go 中这样做。

在您提供的示例中测试代码的自然方式
将是:1) 为 MyStruct.one 编写表驱动测试
并确保您测试所有情况。现在你知道了 one工作得很好 2) 对 MyStruct.two 做同样的事情.
请注意,测试未导出的内容是可能的、有用的并且
在 Go 中很常见。现在不再需要模拟
一些方法,只是 3) 写一些表驱动的测试MyStruct.Three并检查它是否有效。

但也许你的方法 onetwo做更高级的东西,并且
访问环境(文件系统、数据库、网络)和
你不想要你的 Three 测试依赖那个?
所以重构你的代码!也许 Three不应该是一种方法
MyStruct但是一个接受 interface OneAndTwoer 的函数
作为参数,您的生产代码调用 Three与“真实”
MyStructs 而您的测试代码使用 InMemoryMyStrcuts 调用它
哪个不依赖于环境?你可以称之为
模拟,我称之为接口(interface)的不同实现。

在您的示例中,提供建议很简单:使用表驱动
测试 one , twoThree不要 mock 。
对于更现实的问题,建议可能会有所不同,但
在不了解情况的情况下很难给出一般性建议
情况。最好的一般建议是:查看测试
标准库,您几乎可以在其中找到有用的模式
每个测试场景。

关于unit-testing - Go 中的模拟接收器功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29246249/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4