我可以在python单元测试中伪造/模拟我的模拟对象的类型

Ali*_*Ali 24 python unit-testing mocking

在我的python代码中,我检查其中一个参数的类型,以确保它是我期望的类型.例如:

def myfunction(dbConnection):
    if (type(dbConnection)<>bpgsql.Connection):
        r['error'] += ' invalid database connection'
Run Code Online (Sandbox Code Playgroud)

我想通过模拟连接进行测试.有没有办法让模拟对象伪装成正确的类型?

Ali*_*Ali 56

尽管如此,看起来你们不太对劲!

我可以使用鸭子打字,但有一种方法可以做我想要做的事情:

来自http://docs.python.org/dev/library/unittest.mock.html

使用类或实例作为规范或spec_set的模拟对象能够通过isintance测试:

>>>
>>> mock = Mock(spec=SomeClass)
>>> isinstance(mock, SomeClass)
True
>>> mock = Mock(spec_set=SomeClass())
>>> isinstance(mock, SomeClass)
True
Run Code Online (Sandbox Code Playgroud)

所以我的示例代码将是:

m = mock.MagicMock(spec=bpgsql.Connection)
isinstance(m, bpgsql.Connection) 
Run Code Online (Sandbox Code Playgroud)

这返回True

所有这一切,我不是在争论python中的严格类型检查,我说如果你需要检查它你可以做它,它也适用于测试和嘲笑.

  • 此外,有时您只是无法控制另一个图书馆如何做事。如果外部正在检查类型,那么使用规范或至少将模拟的 `__class__` 设置为正确的类型可能是最简单的。 (2认同)