[英]How can I mock Go functions in my tests?
我在StackOverflow上阅读了一些问题,询问如何time.Now()
诸如time.Now()
函数。 解决方案似乎是编写一个实现特定接口的结构,然后在测试中传递该模拟对象。
有更好的方法吗? 由于在Golang中没有足够好的实现依赖项注入容器的实现,所以我不想手动传递结构,也不想创建内部仅包含以下内容的结构:
func (s MyStruct) Now() {
return time.Now()
}
因为,首先,我无法测试此功能。 当您处理其中没有变量的一行时,可能什么都不是,但是我有一个连接到TCP端口的函数。 做这样的事情需要我为它使用的所有东西创建适配器(例如net.Dial()
, time.Now()
, io.Copy()
, bufio.Read()
等)。
其次,由于没有DI,我将不得不传递结构,这最终会使我的代码混乱,而不是像其他语言的DI一样使阅读更容易。
除了使您能够轻松模拟这些功能外,为此类事情编写“适配器”(您自己的接口)还具有从任何单独的实现中抽象代码的优点。
在代码中传递结构还可以使您的应用不受某种注入框架的外部依赖(无论如何,其中很多都违反了IOC的原理)。
除了为这些依赖关系编写自己的接口外,某些设计理念还可以帮助您进行模拟。
例如,使用域驱动的设计模式,您可以简单地在单元测试中模拟“存储库”,而不是模拟数据库库。
在Go中,所有这些最终都非常简洁明了,而没有成群的第三方框架为您神奇地完成工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.