我在 StackOverflow 上阅读了一些关于如何模拟 time.Now()
等函数的问题。解决方案似乎是编写一个实现特定接口(interface)的结构,然后在测试中传入该模拟。
有更好的方法吗?由于在 Golang 中没有足够好的依赖注入(inject)容器实现,我不想手动传递结构,或者创建一个内部只有这样的结构:
func (s MyStruct) Now() {
return time.Now()
}
因为,首先,我无法测试这个 函数。当你处理其中没有变量的一行时,它可能什么都不是,但我有一个连接到 TCP 端口的函数。做这样的事情需要我为它使用的所有东西创建适配器(例如 net.Dial()
、time.Now()
、io.Copy()
、bufio.Read()
和许多其他)。
其次,由于没有 DI,我将不得不四处传递结构,这最终会使我的代码困惑,而不是像其他语言中的 DI 那样使其更易于阅读。
最佳答案
除了使您能够轻松地模拟这些功能之外,为此类功能编写“适配器”(您自己的接口(interface))还具有从任何单独的实现中抽象出您的代码的优势。
在您的代码中传递结构还可以防止您的应用程序依赖于某种注入(inject)框架(其中许多框架无论如何都违反了 IOC 原则)。
除了为这些依赖项编写您自己的接口(interface)外,某些设计哲学还可以帮助您模拟 .
例如,使用领域驱动设计模式,您可以在单元测试中简单地模拟您的“存储库”,而不是模拟数据库库。
在 Go 中,所有这些都非常干净、简洁,没有一大群第三方框架神奇地为您完成工作的负担。
关于unit-testing - 我如何在测试中模拟 Go 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35101663/