Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 覆盖';是';模拟对象的运算符_Python_Mocking_Overriding_Python Unittest_Python Unittest.mock - Fatal编程技术网

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始终表示标识。