在我的 python 代码中,我检查其中一个参数的类型以确保它是我期望的类型。例如:
def myfunction(dbConnection):
if (type(dbConnection)<>bpgsql.Connection):
r['error'] += ' invalid database connection'
我想通过一个模拟连接进行测试。有没有办法让模拟对象假装是正确的类型?
在我的 python 代码中,我检查其中一个参数的类型以确保它是我期望的类型。例如:
def myfunction(dbConnection):
if (type(dbConnection)<>bpgsql.Connection):
r['error'] += ' invalid database connection'
我想通过一个模拟连接进行测试。有没有办法让模拟对象假装是正确的类型?
恕我直言,看来你们不太对劲!
我可以像说的那样使用鸭子打字,但是有一种方法可以做我最初打算做的事情:
来自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 中进行严格的类型检查,我说如果你需要检查它,你可以做到,它也适用于测试和模拟。
这或多或少正是您不应该强制执行严格类型检查的原因!您应该从代码中完全删除该行。
如果您不想这样做,请编写一个具有您想要的属性的抽象基类 ( .connect()
, .cursor()
, ...?) 并检查isinstance
它。
aaages也<>
已过时。使用!=
.