unit-testing - 我如何在测试中模拟 Go 函数?

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

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

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

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

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

其次,由于没有 DI,我将不得不四处传递结构,这最终会使我的代码困惑,而不是像其他语言中的 DI 那样使其更易于阅读。

最佳答案

除了使您能够轻松地模拟这些功能之外,为此类功能编写“适配器”(您自己的接口(interface))还具有从任何单独的实现中抽象出您的代码的优势。

在您的代码中传递结构还可以防止您的应用程序依赖于某种注入(inject)框架(其中许多框架无论如何都违反了 IOC 原则)。

除了为这些依赖项编写您自己的接口(interface)外,某些设计哲学还可以帮助您模拟 .

例如,使用领域驱动设计模式,您可以在单元测试中简单地模拟您的“存储库”,而不是模拟数据库库。

在 Go 中,所有这些都非常干净、简洁,没有一大群第三方框架神奇地为您完成工作的负担。

关于unit-testing - 我如何在测试中模拟 Go 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35101663/

相关文章:

java - 无法使用 InjectMocks-Mockito 实例化模拟对象

python - 如何模拟使用别名导入的函数?

c - C 的 TDD。如何使用 CppUTest 编译和运行我的第一个测试?

go - 如何在Windows上设置“运行”环境

.net - 使用 MSBuild 时不构建私有(private)访问器

golang - bufio 读取多行直到 (CRLF)\r\n 定界符

sockets - 在 Golang 中限制 tcp 下载速度

android - 如何使用 Hilt 绑定(bind)/提供 Activity 或 Fragment?

c++ - Asp.Net Core Dependency Injection 不起作用,如果它是从非托管/ native 启动的

asp.net - Startup.ConfigureServices 中方法调用的顺序是否重要?