Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 如何在测试中模拟Go函数?_Unit Testing_Go_Dependency Injection_Inversion Of Control - Fatal编程技术网

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

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() } 因为,首先,我不能测试这个函数。当您处理一个没有变量的行时,它可能什么都不是,但是我有一个连接到

我已经阅读了一些有关StackOverflow的问题,这些问题询问如何模拟诸如
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)提供的一个相当不错的依赖注入框架。