Go 行为错误的模拟函数仍然通过
我正在为依赖于其他函数的函数编写测试。我使用Go 行为错误的模拟函数仍然通过,go,testing,Go,Testing,我正在为依赖于其他函数的函数编写测试。我使用Gomock库来模拟这些依赖项的行为,这是其中之一: &mock.UseCaseToDependOn{ UpdateStatusFuncMock: func(ID data.ID) ([]*ObjectsToReturn, error) { return case.in.updateStatusFuncReturnsObjects, case.in.updateStatusFuncReturnsError },
Gomock
库来模拟这些依赖项的行为,这是其中之一:
&mock.UseCaseToDependOn{
UpdateStatusFuncMock: func(ID data.ID) ([]*ObjectsToReturn, error) {
return case.in.updateStatusFuncReturnsObjects, case.in.updateStatusFuncReturnsError
},
},
然而,在代码检查中,我意识到使用状态机模式的UpdateStatusFuncMock
mock函数返回的是基于输入的不合逻辑的数据,但是,测试仍然顺利通过
这对我来说真的很奇怪,因为我认为在这种情况下测试应该失败
另一方面,如果我提供的数据仅符合逻辑,那么:
- 首先,我需要了解测试所依赖的函数的内部行为。这是好事还是坏事
- 其次,我认为这样做只会产生误报,因为测试仍然通过了错误行为的模拟函数
使用输入和输出必须遵守现有逻辑的模拟函数是否好?首先,区分白盒测试和黑盒测试很重要。 根据你要做的是哪一个,遵循最好的方法,正如前面的评论所说,它是干净的,而且通常最好使用赝品或存根
您可以创建一组测试,其中存根返回错误,另一个测试具有预期的输出。“使用[whatever]创建模拟函数是否合适”。不是。IMHO模拟是一种非常糟糕的测试实践(除了一些非常特殊的情况)。正如您所指出的,模拟通常倾向于测试内部实现细节。有些语言如果没有模仿就无法进行测试,但我认为使用存根或赝品是很容易的,而且会导致更干净更好的测试。