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

时间:2012-07-01 13:33:38

标签: python unit-testing mocking

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

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

我想传递一个模拟连接用于测试目的。有没有办法让模拟对象伪装成正确的类型?

2 个答案:

答案 0 :(得分:50)

得到应有的尊重,看起来你们不太对劲!

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

来自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中的严格类型检查,我说如果你需要检查它你可以做它并且它也适用于测试和嘲笑。

答案 1 :(得分:3)

这或多或少就是为什么你不应该强制执行严格的类型检查!您应该完全从代码中删除该行。

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

同样<>已经过时了。使用!=