我正在尝试对调用该结构中的其他接收器函数的接收器函数进行单元测试。
假设我想测试 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
}
这是一种非常不习惯的方式来测试你的东西。
其他语言可能需要所有这些模拟,但是
请不要在 Go 中这样做。
在您提供的示例中测试代码的自然方式
将是:1) 为 MyStruct.one
编写表驱动测试
并确保您测试所有情况。现在你知道了 one
工作得很好 2) 对 MyStruct.two
做同样的事情.
请注意,测试未导出的内容是可能的、有用的并且
在 Go 中很常见。现在不再需要模拟
一些方法,只是 3) 写一些表驱动的测试MyStruct.Three
并检查它是否有效。
但也许你的方法 one
和 two
做更高级的东西,并且
访问环境(文件系统、数据库、网络)和
你不想要你的 Three
测试依赖那个?
所以重构你的代码!也许 Three
不应该是一种方法
的 MyStruct
但是一个接受 interface OneAndTwoer
的函数
作为参数,您的生产代码调用 Three
与“真实”
MyStructs 而您的测试代码使用 InMemoryMyStrcuts 调用它
哪个不依赖于环境?你可以称之为
模拟,我称之为接口(interface)的不同实现。
在您的示例中,提供建议很简单:使用表驱动
测试 one
, two
和 Three
不要 mock 。
对于更现实的问题,建议可能会有所不同,但
在不了解情况的情况下很难给出一般性建议
情况。最好的一般建议是:查看测试
标准库,您几乎可以在其中找到有用的模式
每个测试场景。
关于unit-testing - Go 中的模拟接收器功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29246249/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |