我正在使用第三方库,它是一些 C 函数的包装器。不幸的是,几乎所有的 Go 函数都是免费的(它们没有接收器,它们不是方法);不是我会采用的设计方法,但它就是我所拥有的。
仅使用 Go 的标准“测试”库:
是否有一种解决方案允许我创建可以模拟函数的测试?
或者是将库包装成结构和接口(interface),然后模拟接口(interface)来实现我的目标的解决方案?
我创建了一个蒙特卡洛模拟,它也处理生成的数据集。我的一种评估算法会寻找特定模型,然后将其传递给第三方函数进行评估。我知道我的边缘情况并且知道调用计数应该是多少,这就是我想要测试的。
也许只需要一个简单的计数器?
我发现使用这个库的其他项目没有完全覆盖或根本没有测试。
最佳答案
您可以通过在需要调用时使用对实际函数的引用来实现这一点。
然后,当您需要模拟函数时,只需将引用指向模拟实现即可。
假设这是您的外部函数:
// 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
这个 playground 把它放在一起,可能比解释更清楚:
https://play.golang.org/p/xBuriFHlm9
如果您有一个接收func(int) int
的函数,您可以向该函数发送实际的externalFunction
或mockFunction
当您希望它使用模拟实现时。
关于function - Golang 函数测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46245549/