Python 覆盖';是';模拟对象的运算符
简化代码:我有一个函数,它期望一个数字或无,如果是Python 覆盖';是';模拟对象的运算符,python,mocking,overriding,python-unittest,python-unittest.mock,Python,Mocking,Overriding,Python Unittest,Python Unittest.mock,简化代码:我有一个函数,它期望一个数字或无,如果是None,则返回True,如果是数字,则返回False,如: def function(var): return var is None 我想传递一个模拟对象,并使用is操作符对其进行测试,如下所示: from unittest.mock import Mock mock = Mock(return_value=None) assert function() 这将失败,尽管我将该值模拟为None。根据,有许多受支持的魔术方法,但没有
None
,则返回True
,如果是数字,则返回False
,如:
def function(var):
return var is None
我想传递一个模拟对象,并使用is
操作符对其进行测试,如下所示:
from unittest.mock import Mock
mock = Mock(return_value=None)
assert function()
这将失败,尽管我将该值模拟为None
。根据,有许多受支持的魔术方法,但没有一种让我实现这种情况下的行为
更改为
assert mock==None
将允许我使用\uuu eq\uuu
操作符,但我不想触碰代码(显然使用is
比=
根据更快)也许使用isinstance()
而不是is
会对您有效。将模拟对象类声明为类MockInt(int):
将使isinstance()将变量识别为int:
class MockInt(int):
def __init__(self,value): self.value = value
i = MockInt(23)
print( isinstance(i,int) ) # True
TL;博士
当有返回值时,不要忘记括号
from unittest.mock import Mock
mock = Mock(return_value=None)
assert function(mock())
更多信息
如果要传递一个包含None
的变量来测试函数
,则无需使用Mock
。您可以编写以下代码:
mock = None
assert function(mock)
Mock
的最佳用法是当您想要模拟具有更复杂结构的方法或对象时。因此,当您编写mock=mock(return\u value=None)
时,您必须调用mock
以返回返回值
,正如许多人指出的那样,是
是“无法克服的”,因为它是对ID的快速平等检查。这就是为什么与\uuuu eq\uuuu
相比会有性能差异的原因
有关这一点的更多信息,请参见。您不能更改is
如果您尝试同时实现这两个功能,您如何说is
会更快?“更改为assert mock==None将允许我使用eq运算符,但我希望避免使用它,因为根据此答案,显然使用is比==更快。”这不会是一场重要的演出issue@juanpa.arrivillaga:可能不是性能问题,但在性能方面存在差异>>>timeit.Timer(“无==无”).timeit()0.026401887999782048>>>timeit.Timer(“无即无”).timeit()0.02391680099935911 BTW,这些是平均数values@ezib因为该语言没有为is
提供钩子,is始终表示标识。