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

时间:2016-01-30 12:15:10

标签: unit-testing go dependency-injection inversion-of-control

我已经在StackOverflow上阅读了一些问题,询问如何模拟time.Now()等函数。解决方案似乎是编写一个实现特定接口的结构,然后在测试中传入该模拟。

有更好的方法吗?由于在Golang中没有足够好的依赖注入容器实现,我不想手动传递结构,或者创建一个只有这样的结构的结构:

func (s MyStruct) Now() {
    return time.Now()
}

因为,首先,我无法测试功能。当你处理一个没有变量的行时,它可能没什么,但我有一个连接到TCP端口的函数。做这样的事情需要我为它使用的一切创建适配器(例如net.Dial()time.Now()io.Copy()bufio.Read()等等。

其次,由于没有DI,我将不得不传递结构,这将最终使我的代码混乱,而不是像其他语言中的DI一样更容易阅读。

1 个答案:

答案 0 :(得分:0)

除了让您轻松模拟这些功能外,还可以编写适配器' (你自己的界面)这样的东西有利于从任何单独的实现中抽象你的代码。

在代码中传递结构也会使您的应用程序不受外部依赖关系的某种注入框架(其中许多都违反了IOC的原则)。

除了为这些依赖项编写自己的接口外,某些设计理念可以帮助您进行模拟。

例如,使用域驱动的设计模式,您只需模拟您的"存储库"在单元测试中而不是模拟数据库库。

在Go中,所有这一切都非常干净,简洁,没有大量第三方框架的负担,神奇地为你工作。