繁体   English   中英

如何在测试中模拟Go函数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM