【问题标题】:Mocking methods from package包中的模拟方法
【发布时间】:2017-11-16 11:48:58
【问题描述】:

我希望模拟一些用于单元测试的方法。不幸的是,代码的结构不是很好。

var config = struct { abc *abc }

func Init(arg1) {
    // config.abc = newAbc(arg2, arg3)
}   

func UnitTestThis() { 
    //some code here 

    config.abc.Search(arg4,arg5) 

    //code here 
}

如何对 UnitTestThis 函数进行单元测试,模拟 Search 方法的结果?我一直在尝试创建一个接口并模拟方法,但无法这样做。

【问题讨论】:

  • 无法这样做为什么?您遇到的实际问题是什么?

标签: unit-testing go mocking


【解决方案1】:

如果config.abc 字段是具体类型(或指向具体类型的指针),则不能真正模拟它。

你需要一些重构。

带接口

最好将config.abc 的类型更改为接口类型,因此在测试中您可以创建自己的实现并分配给它,您可以在其中做任何您想做的事情。

config.abc.Search 上使用方法值

另一种选择是创建一个函数类型的变量来保存config.abc.Search()method value,并在测试中为其分配一个新值,例如function literal

这就是它的样子:

var config = struct{ abc *abc }{}

var searchFunc func(arg4Type, arg5Type)

func Init(arg1) {
    config.abc = newAbc(arg2,arg3)
    searchFunc = config.abc.Search
}

func UnitTestThis() {
    //some code here
    searchFunc(arg4, arg5)
    //code here
}

在此处了解更多信息:Is it possible to mock a function imported from a package in golang?

【讨论】:

  • searchFunc 可以成为接收者吗?如果是这样,这个语法会是什么样子?
  • @GyanendraSingh 我不明白这个问题。
  • var searchFunc func(arg2Type, arg3Type) -> 对于接收者来说,它的外观如何以及定义?
  • @GyanendraSingh 我还是不明白。 searchFunc 是一个函数类型的变量,Init() 用隐式存储接收者值的方法值初始化它。
  • 感谢 icza!我能够使用函数变量设置测试。但是,从某种意义上说,如果分配给与定义匹配的某些其他功能,这会导致滥用/错误。我将尝试使用接口进行设置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-17
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
  • 2013-11-14
相关资源
最近更新 更多