没有接收器的模拟功能

时间:2020-06-05 04:43:13

标签: go testify go-testing

我有文件util.go

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

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

我从testify开始使用Foo编写单元测试。我要:

  1. 模拟helper
  2. 断言嘲讽helper被调用1次

我在{{3}}看到了一些有前途的解决方案,但是不确定:

方法1:将辅助程序作为Foo的参数。我的疑问:作证需要AssertNumberOfCalls的Mock结构,这里没有结构。

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

执行此操作的最佳方法是什么?

1 个答案:

答案 0 :(得分:-1)

如果只想测试helper中被调用的args,这就是我一直在使用的一种方法。相同的测试还将证明您的助手被准确地调用过一次。

    // 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)
        }
    }
相关问题