登录
首页 >  Golang >  Go问答

模拟功能免接收器

来源:stackoverflow

时间:2024-03-26 23:33:29 439浏览 收藏

本文探讨了如何使用testify单元测试框架在不修改原始代码的情况下模拟函数。作者认为最好的方法是在被测试函数中调用helper函数时使用匿名函数来捕获参数,并通过对修改后的helper函数的调用次数进行断言来测试helper是否被调用。作者提供了一个代码示例来演示如何实现这种方法。

问题内容

我有文件 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 看到了一些有前途的解决方案,但不确定它们:

方法1:将helper作为foo的参数传递。我的疑问:testify 需要一个 mock 结构来 assertnumberofcalls,而这里没有结构。

方法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)
        }
    }

今天关于《模拟功能免接收器》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>