【问题标题】:Golang testing with functionsGolang 函数测试
【发布时间】:2017-09-16 04:24:24
【问题描述】:

我正在使用第三方库,它是一些 C 函数的包装器。不幸的是,几乎所有的 Go 函数都是免费的(它们没有接收器,它们不是方法);不是我会采用的设计方法,但它就是我所拥有的。

仅使用 Go 的标准“测试”库:

有没有一种解决方案可以让我创建可以模拟函数的测试?

或者是将库包装成结构和接口,然后模拟接口以实现我的目标的解决方案?


我创建了一个蒙特卡罗模拟,它也处理生成的数据集。我的评估算法之一寻找特定模型,然后将其传递给第三方函数进行评估。我知道我的边缘情况并且知道调用计数应该是什么,这就是我想要测试的。

也许只需要一个简单的计数器?


我发现的使用这个库的其他项目没有完全覆盖或根本没有测试。

【问题讨论】:

  • 什么是“免费”功能?
  • 没有 Go 接收器的函数。它们与结构无关。
  • 所以,你的意思是“函数”,因为任何带有接收器的东西都会被认为是一种方法。函数在大多数惯用的 go 中被广泛使用,并且没有什么可以阻止它们进行单元测试。你到底想模拟什么? Go 通常不会走某些语言使用的“模拟一切”的道路,这通常最终只是测试模拟而不是任何有用的东西。
  • 测试函数的典型方法是传递输入,然后将输出与您期望的进行比较。是否需要模拟取决于输入和输出——而不是它是函数还是方法。如果您可以提供一些您正在尝试测试的示例,则可能会有更好的答案。否则,唯一的选择就是猜测。

标签: function unit-testing go


【解决方案1】:

您可以在需要调用时使用对实际函数的引用来做到这一点。

然后,当您需要模拟函数时,只需将引用指向模拟实现即可。

假设这是你的外部函数:

// this is the wrapper for an external function
func externalFunction(i int) int {
   return i * 10  // do something with input
}

您永远不会直接调用它,而是声明对它的引用:

var processInt func(int) int = externalFunction

当您需要调用函数时,您可以使用参考:

fmt.Println(processInt(5))

然后,你想模拟你刚刚为该引用分配一个模拟实现的函数:

processInt = mockFunction

这个游乐场把它放在一起,可能比解释更清楚:

https://play.golang.org/p/xBuriFHlm9

如果您有一个接收func(int) int 的函数,您可以发送该函数实际的externalFunctionmockFunction,当您希望它使用模拟实现时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 2016-08-09
    • 2021-09-26
    • 2022-11-22
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多