【发布时间】:2016-05-08 04:48:09
【问题描述】:
我在 StackOverflow 上阅读了一些问题,询问如何模拟 time.Now() 等函数。解决方案似乎是编写一个实现特定接口的结构,然后在测试中,改为传递该模拟。
有没有更好的方法来做到这一点?由于在 Golang 中没有足够好的依赖注入容器实现,我不想手动传递结构,或者创建一个内部只有这样的结构:
func (s MyStruct) Now() {
return time.Now()
}
因为,首先,我无法测试 this 功能。当您处理其中没有变量的一行时,它可能什么都不是,但我有一个连接到 TCP 端口的函数。做这样的事情需要我为它使用的所有东西创建适配器(例如net.Dial()、time.Now()、io.Copy()、bufio.Read() 等等)。
其次,由于没有 DI,我将不得不传递结构,这最终会使我的代码变得混乱,而不是像 DI 在其他语言中那样更容易阅读。
【问题讨论】:
-
这是一个来自 Parse (R.I.P) 的相当不错的依赖注入框架。 godoc.org/github.com/facebookgo/inject
标签: unit-testing go dependency-injection inversion-of-control