在单元测试中模拟对象时避免使用类型警告?

时间:2018-05-16 05:18:56

标签: python python-unittest mypy python-unittest.mock

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

def foo(bar: SomeComplexObject):
    ...

在单元测试中,bar将替换为mock object,但课程现在会引发类型警告。我应该简单地忽略或压制这些或者是否有适当的方法来处理它们(当然不改变原始的功能签名)?

更新:我现在已经看到这是mypy上的open issue,但它已经在该州停留了两年多。关于如何解决这个问题已经达成共识?

1 个答案:

答案 0 :(得分:2)

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

剩下的问题是如何处理。理想情况下,如果您的函数期望使用SomeComplexObject,那么您还应传入其实例。通过在您的测试装置中构建一个,或通过子类化并覆盖不需要的内容,要么。最好的单元测试是在正确输入下进行的测试。

这仍然不可行,或者我们明确想测试无效输入的处理方式。在这种情况下,只需将您的模拟明确转换为mypy所需的类型:

from typing import cast

def test_foo():
    mock_bar = cast(SomeComplexObject, MockBar())
    foo(mock_bar)