Unit testing 如何在测试中模拟Go函数?
我已经阅读了一些有关StackOverflow的问题,这些问题询问如何模拟诸如Unit testing 如何在测试中模拟Go函数?,unit-testing,go,dependency-injection,inversion-of-control,Unit Testing,Go,Dependency Injection,Inversion Of Control,我已经阅读了一些有关StackOverflow的问题,这些问题询问如何模拟诸如time.Now()之类的函数。解决方案似乎是编写一个实现特定接口的结构,然后在测试中传入该模拟 有更好的方法吗?由于Golang中没有足够好的依赖项注入容器实现,我不想手动传递结构,也不想创建一个内部只有如下内容的结构: func (s MyStruct) Now() { return 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中,所有这些都非常干净、简洁,没有一大群第三方框架神奇地为您完成工作的负担。这是Parse(R.I.p)提供的一个相当不错的依赖注入框架。