当我尝试对如下函数进行单元测试时,extern_pkg
是要模拟的外部包:
import "extern_pkg"
func MyFunc() {
...
extern_pkg.F()
}
func main() {
MyFunc()
}
我阅读了一些博客,它们似乎都是通过使用依赖注入(inject)修改 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)
}
然后在测试代码中,创建一个满足
exter
的mock对象接口(interface),并传递给 MyFunc
作为参数。我的问题是:
MyFunc
函数包含许多要模拟的外部包,我需要将每个包作为函数参数吗?函数所依赖的任何全局变量也是如此吗? var global_var
func MyFunc() {
...
extern_pkg1.F()
...
extern_pkg2.G()
...
extern_pkg3.H()
...
global_var
}
谢谢!
最佳答案
尝试使用 func 类型的 vars 并注入(inject)它们。它更容易,不需要更少的代码和接口(interface)。见 godif
关于unit-testing - 在 golang 中模拟依赖项是否需要 DI(依赖项注入(inject))?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59455474/