首页 > 解决方案 > 证明在函数内部模拟函数返回

问题描述

我想模拟一个函数的响应。但是此函数位于或在另一个函数内部调用。假设我有这个功能

// main.go
func TheFunction() int {
   // Some code
   val := ToMockResponse()
   return val
}

func ToMockResponse() int {
    return 123
}

现在在我的测试文件上

// main_test.go
func TestTheFunction(t *testing.T) {
    mockInstance = new(randomMock)
    mockInstance.On("ToMockResponse").Return(456)

    returned := TheFunction()
    assert.Equal(t, 456, returned)
}

正如您在函数TheFunction()中看到的那样,调用了函数ToMockResponse。现在我想测试TheFunction但我想模拟ToMockResponse的响应如何实现?

标签: gotestify

解决方案


您应该考虑传入第二个函数作为第一个函数的参数。

你有几个选项可以做到这一点。您可以简单地将其作为参数传递。

func DoX(doY func()) {
   doY()
}

这很简单,但随着核心变得更加复杂,效果不佳。更好的选择通常是在结构上创建函数方法。

type X struct {
   Y Y
}

type Y interface {
   Do()
}

func (x *X) Do() {
   x.Y.Do()
}

然后 Y 可以用模拟替换。


推荐阅读