unit-testing - 在 golang 中模拟依赖项是否需要 DI(依赖项注入(inject))?

标签 unit-testing go dependency-injection

当我尝试对如下函数进行单元测试时,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/

    相关文章:

    database - 为复杂数据库 (EAV) 生成单元测试数据

    javascript - 如何使用 jasmine 在 XHR 中模拟超时事件?

    string - 为什么这种从 rune 字符串到整数的转换不起作用?

    java - 使用依赖注入(inject)实现数据访问 API

    dependency-injection - Ninject 绑定(bind)所有实现相同接口(interface)的类

    c# - 单元测试应该测试方法的功能吗?

    python - 如何模拟 python 的 read()

    json - 如何在 Golang 中创建字典列表?

    go - $GOPATH 目录和磁盘空间

    java - 带有 Spring @Configuration 的属性