【问题标题】:Testify Mock a function return inside a function证明在函数内部模拟函数返回
【发布时间】:2018-06-07 02:55:59
【问题描述】:

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

// 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 的响应,我该如何实现呢?

【问题讨论】:

  • 使 ToMockResponse 成为全局变量,并将其值更改为您的模拟实现。另一个建议:停止在 Go 测试中模拟和断言。查看标准库中的测试并从中学习。
  • @volker 也许有些人不称它们为模拟,但即使在标准库测试中,他们也会创建与接口匹配的对象,并使用它们在测试中排除外部因素。

标签: go testify


【解决方案1】:

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

您有几种选择。您可以简单地将其作为参数传递。

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

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

type X struct {
   Y Y
}

type Y interface {
   Do()
}

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

那么 Y 可以用 mock 代替。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 2021-08-27
    相关资源
    最近更新 更多