【问题标题】:Mock function with wrong behavior still pass具有错误行为的模拟功能仍然通过
【发布时间】:2020-06-15 04:08:20
【问题描述】:

我正在为依赖于其他函数的函数编写测试。我使用Gomock 库来模拟这些依赖项的行为,这是其中之一:

&mock.UseCaseToDependOn{
    UpdateStatusFuncMock: func(ID data.ID) ([]*ObjectsToReturn, error) {
        return case.in.updateStatusFuncReturnsObjects, case.in.updateStatusFuncReturnsError
    },
},

但是,在代码审查中,我意识到使用状态机模式的 UpdateStatusFuncMock 模拟函数正在根据输入返回不合逻辑的数据,但是,测试仍然很好地通过了。

这对我来说真的很奇怪,因为我相信在这种情况下测试应该失败。

另一方面,如果我提供的数据只是遵循逻辑,那么:

  • 首先,我需要了解我的测试所依赖的函数的内部行为。这是好事还是坏事?
  • 其次,我认为这样做只会产生误报,因为对于具有错误行为的模拟函数,测试仍然通过。

创建输入输出必须遵守现有逻辑的模拟函数好不好?

【问题讨论】:

  • “用 [whatever] 创建模拟函数好不好”。不,恕我直言,模拟是一种非常糟糕的测试实践(除了一些非常特殊的情况)。正如您所指出的,模拟通常倾向于测试内部实现细节。有些语言在没有模拟的情况下无法测试,但我认为在 Go 中使用 stub 或 fakes 很容易,并且可以带来更简洁更好的测试。

标签: go testing


【解决方案1】:

首先,区分白盒测试和黑盒测试很重要。 https://www.geeksforgeeks.org/differences-between-black-box-testing-vs-white-box-testing/

根据您要尝试的方法,请遵循最佳方法,正如前面的评论所说,它是干净的,通常使用假货或存根更好。

您可以创建一组带有返回错误的存根测试和另一个带有预期输出的测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2017-09-10
    • 1970-01-01
    • 2017-07-02
    • 2022-12-02
    • 2014-07-05
    • 1970-01-01
    相关资源
    最近更新 更多