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

我可以在python单元测试中伪造/模拟模拟对象的类型吗,python,unit-testing,mocking,Python,Unit Testing,Mocking,在我的python代码中,我检查其中一个参数的类型,以确保它是我期望的类型。例如: def myfunction(dbConnection): if (type(dbConnection)<>bpgsql.Connection): r['error'] += ' invalid database connection' def myfunction(数据库连接): if(类型(dbConnection)bpgsql.Connection): r['error

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

def myfunction(dbConnection):
    if (type(dbConnection)<>bpgsql.Connection):
        r['error'] += ' invalid database connection'
def myfunction(数据库连接):
if(类型(dbConnection)bpgsql.Connection):
r['error']+='invalid database connection'

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

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

如果您不想这样做,请编写一个抽象基类,其中包含您想要的属性(
.connect()
.cursor()
,…?),并选中该属性的
isinstance


而且,
已经过时很久了。使用
=

恕我直言,看来你们的观点不太正确

如前所述,我可以使用duck打字,但有一种方法可以实现我最初的目标:

使用类或实例作为
规范
规范集
的模拟对象能够通过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) 
这是真的


综上所述,我并不支持python中严格的类型检查,我说如果你需要检查它,你可以这样做,它也可以用于测试和模拟。

使用而不是依赖于确切的类名。因此基本上答案是不,你不能伪造你的类型,而不是直接检查类型,看看它是否像鸭子一样走路,如果它是,那么它就足够好了,对吗?@Ali
isinstance(x,Foo)
如果
x
Foo
,包括如果
x
Foo
的子类的实例,则返回true。永远不要直接比较类型。这不仅会阻止像这样的测试,而且如果两次导入同一模块会导致同一类型的不同类定义比较不相等,这将导致问题。也不推荐使用,请使用!=@Martijn,它将在旧版本的IDLE中运行。这是我曾经遇到过的事情。谢谢,那么我可以问一下
patch
的作用吗?我承认我还没有理解它的功能,但对我来说,它似乎模拟了一个不同的类,100%同意isinstance()而不是直接类型检查。此外,有时你无法控制另一个库的工作方式。如果外部的东西正在检查类型,可能最简单的方法就是使用spec,或者至少将mock的
\uuu class\uuu
设置为正确的类型。我尝试了PyCharm的静态检查,但没有效果。但似乎它应该起作用;您可以在此处找到错误: