我正在寻找断言我的测试中涵盖了一个语句。例如,假设从测试开始调用 methodA(),它引用了 methodB()。
我想断言在从测试中执行 methodA() 时会调用 methodB()。
在下面的代码中,我如何在 Go 测试中断言 svc.AddCheck() 在执行 svc.OnStartup() 时被调用?
func (svc *Servjice) OnStartup() error {
if err := svc.AddCheck("cache"); err != nil {
return err
}
return nil
}
最佳答案
Is it possible to assert that a real method is called via spying in Go like Java Mockito?
一句话:没有。
但是替代方案呢?
您应该测试的是函数的效果。在任何语言中都是如此,不仅仅是 Go。无论您是在进行单元测试还是一些更高级别的测试,包括端到端测试,这也是事实。
如果您的methodB()
调用methodA()
,本身检查methodA() 是没有用的
被调用。 有用的是检查 methodB()
是否按照您的预期进行。无论它是否使用 methodA()
来实现,根据定义,您的测试不应该关心的实现细节。
一些例子:
假设您正在编写一个集成测试,
methodA()
将一些内容插入到数据库中。不要断言methodA()
已被调用——而是断言您期望的行现在已在数据库中。假设您正在为 Fibonacci 生成器编写单元测试。不要断言它是否调用了
methodA()
,断言它是否返回了正确的值。
当您断言一个子方法被调用时,您担心的是实现细节——函数的“方式”。这不是好的测试所做的。良好的测试可确保您的方法产生正确的结果。从测试的角度来看,无论它是通过调用 methodA()
、methodZ()
、REST API 还是使用 Jedi powers 来实现,都应该无关紧要。
所以 TL;DR;不,你不能按照你的要求去做,但这没关系,因为你不应该按照你的要求去做。有更好的选择(甚至在 Java 中)。
关于go - 是否可以断言通过像 Java Mockito 一样在 Go 中进行 spy 事件来调用真正的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57766045/