10

假设我有一个函数需要一个复杂的对象并用它做一些事情:

def foo(bar: SomeComplexObject):
    ...

在单元测试bar中将被模拟对象取代,但课程现在会引发类型警告。我应该简单地忽略或抑制这些,还是有适当的方法来处理它们(当然不改变原始函数签名)?

更新:我现在看到这是 mypy 上的一个未解决问题,但它已经处于这种状态超过两年了。有没有就如何解决这个问题达成共识?

4

1 回答 1

4

我将投入我的 2 美分并说你应该检查你的测试套件。它的静态代码和静态类型检查将帮助您更快地编写更好的代码。

这就留下了如何做的问题。理想情况下,如果您的函数需要,SomeComplexObject那么您也可以传入其中的一个实例。通过在您的测试夹具中构建一个,或者通过子类化和覆盖您不需要的东西。最好的单元测试是在正确输入上运行的单元测试。

这仍然存在不切实际的情况,或者我们明确想要测试如何处理无效输入。在这种情况下,只需将您的模拟显式转换为 mypy 所需的类型:

from typing import cast

def test_foo():
    mock_bar = cast(SomeComplexObject, MockBar())
    foo(mock_bar)
于 2020-05-22T08:42:00.723 回答