-2

例如

type test struct { // few fields}
func (t *test) createresource(res1 string,res2 string)error {
     //doing some task

     t.createsubresource(res1)
}

func (t *test)createsubresource(res1 string)error{
    //perform some task
}

我想为 createresource 编写测试函数,如何模拟 t.createsubresource(res1) 调用。这是遗留代码,我无权修改上述任何功能。

4

1 回答 1

3

您的模拟可以使用interfaces来完成,例如:

main.go

package main

type TestInterface interface {
    CreateResource(res1 string, res2 string) error
    CreateSubresource (res1 string) error
}

func main() {
    DoSomething(new(Test))   
}

func DoSomething(t TestInterface) {
    t.CreateResource()
}

main_test.go

package main

import "testing"

type TestMock struct {}

func (tm *TestMock) CreateResource(res1 string, res2 string) error {
    return nil
}

func (tm *TestMock) CreateSubresource(res1 string) error {
    return nil
}

func TestDoSomething(t *testing.T) {
    err := DoSomething(new(TestMock))
    //... do your assertions
}

为什么它会这样工作?

调用依赖于特定结构的函数不允许您为其注入替代方案,这就是需要创建使用接口的解决方案的原因。通过拥有一个接口,只需实现一个与该接口匹配的新结构,并将其作为依赖注入传递给将要测试的过程。

另外,检查一下:

  • 默认情况下,没有简单的方法来指向您的原始结构并告诉 Go 从中进行模拟。也许一些 3rd 方库可以做到(但我还没有看到)。
  • 在 go 中,public 和 private 声明由第一个字母定义为大写。通过您示例中的小写声明,我注意到一切都是私有的。
  • 通常测试私有方法不是一个好习惯。关于这个话题有很多讨论,你可以在这里看看这个
  • 还有一些支持库可以进行断言和模拟,例如strutr/testify,请先进行研究。

我希望它可以帮助你。

于 2021-11-23T12:25:01.137 回答