36

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

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

我想通过一个模拟连接进行测试。有没有办法让模拟对象假装是正确的类型?

4

2 回答 2

80

恕我直言,看来你们不太对劲!

我可以像说的那样使用鸭子打字,但是有一种方法可以做我最初打算做的事情:

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

使用类或实例作为specspec_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 中进行严格的类型检查,我说如果你需要检查它,你可以做到,它也适用于测试和模拟。

于 2012-07-01T15:16:16.430 回答
4

这或多或少正是您不应该强制执行严格类型检查的原因!您应该从代码中完全删除该行。

如果您不想这样做,请编写一个具有您想要的属性的抽象基类 ( .connect(), .cursor(), ...?) 并检查isinstance它。

aaages也<>已过时。使用!=.

于 2012-07-01T13:40:54.167 回答