unit-testing - 在 golang 中模拟依赖项是否需要 DI(依赖项注入)?
问题描述
当我尝试对如下函数进行单元测试时,extern_pkg
要模拟的外部包在哪里:
import "extern_pkg"
func MyFunc() {
...
extern_pkg.F()
}
func main() {
MyFunc()
}
我阅读了一些博客,它们似乎都是通过使用依赖注入修改 prod 代码来实现的。例如,如下所示:
type exter interface {
F()
}
func MyFunc(e exter) {
...
e.F()
}
type extpkg struct{}
func (extpkg) F() {extern_pkg.F()}
func main() {
epkg := extpkg{}
MyFunc(epkg)
}
然后在测试代码中,创建一个满足接口的mock对象,并作为参数exter
传递给。MyFunc
我的问题是:
- 如果
MyFunc
函数包含许多要模拟的外部包,我是否需要将每个包作为函数参数进行 DI?函数所依赖的任何全局变量也是如此吗?
var global_var
func MyFunc() {
...
extern_pkg1.F()
...
extern_pkg2.G()
...
extern_pkg3.H()
...
global_var
}
- 有没有办法避免修改产品代码?
谢谢!
解决方案
尝试使用 func 类型的 vars 并注入它们。它更容易,不需要更少的代码和接口。见戈迪夫
推荐阅读
- javascript - 单击 .NET Core 中的单选按钮时 FORM 未提交
- android - android中的PeriodicWorkRequest
- javascript - 如何在反应原生地图中获得缩放级别
- ios - 仅发送数据块(通过 CoreBlueTooth)
- javascript - 未定义的对象,使用 NodeJS 和 Mongoose 从 MongoDB 获取模式较少的数据
- c# - 如何在 C# 中同时进行通话后和渲染屏幕
- java - 如何更改 UIManager.getIcon("OptionPane.errorIcon) 的图标大小?
- r - 如何在r中将数值转换为二进制(使用阈值)?
- css - 滚动未显示具有百分比宽度的元素
- ios - 当我从领域中删除对象时,tableview 如何隐式重新加载?