不带接收器的模拟功能



>我有文件util.go

func Foo(service *SomeService) error {
return helper(service)
}
func helper(service *SomeService) error {
...
}

我正在使用testify编写单元测试,从Foo开始。我想:

  1. 模拟helper
  2. 断言嘲笑helper被叫了 1 次

我在 https://stackoverflow.com/a/19168875/1661745 看到了一些有前途的解决方案,但不确定它们:

方法一:将助手作为Foo参数传递。我的疑问:testify 需要一个 Mock 结构来断言调用次数,这里没有结构。

方法 2:为Foo创建一个结构。我的疑问:我不知道为utils制作结构是否有意义。还需要更多重构,因为Foo的调用者需要一个 utils 结构。

最好的方法是什么?

如果您只想测试在helper中调用的参数,这是我一直在使用的方法。同样的测试也可以证明你的助手只被叫过一次。

// Code
var originalFn = func(arg1, arg2 string) {
...
}

func Foo() {
originalFn(arg1,arg2)
}
// Tests
func TestFoo(t *testing.T) {
tempFn := originalFn
var fnArgs []string
originalFn = func(arg1, arg2) {
fnArgs = append(fnArgs, []string{arg1, arg2})
}
defer originalFn = tempFn
tests := []struct{
expected []string
}{
{
expected: []string{"arg1", "arg2"},
},
}
for _, tt:= range tests {
fnArgs := make([]string, 0)
Foo()
assert.Equal(t, tt.expected, fnArgs)
}
}

最新更新