在我的python代码中,我检查其中一个参数的类型,以确保它是我期望的类型。例如:
def myfunction(dbConnection):
if (type(dbConnection)<>bpgsql.Connection):
r['error'] += ' invalid database connection'
我想传递一个模拟连接用于测试目的。有没有办法让模拟对象伪装成正确的类型?
答案 0 :(得分:50)
得到应有的尊重,看起来你们不太对劲!
我可以使用鸭子打字,但有一种方法可以做我想要做的事情:
来自http://docs.python.org/dev/library/unittest.mock.html
使用类或实例作为spec
或spec_set
的模拟对象能够通过isintance测试:
>>>
>>> mock = Mock(spec=SomeClass)
>>> isinstance(mock, SomeClass)
True
>>> mock = Mock(spec_set=SomeClass())
>>> isinstance(mock, SomeClass)
True
所以我的示例代码就像:
m = mock.MagicMock(spec=bpgsql.Connection)
isinstance(m, bpgsql.Connection)
这会返回True
所有这一切,我不是在争论python中的严格类型检查,我说如果你需要检查它你可以做它并且它也适用于测试和嘲笑。
答案 1 :(得分:3)
这或多或少就是为什么你不应该强制执行严格的类型检查!您应该完全从代码中删除该行。
如果您不想这样做,请编写一个包含您想要的属性的抽象基类(.connect()
,.cursor()
,...?)并检查isinstance
那个。
同样<>
已经过时了。使用!=
。