[英]How to patch classmethod with autospec in unmocked class?
我想断言Python类中的一个类方法调用另一个带有一组参数的classmethod。 我希望模拟的classmethod是“spec-ed”,因此它会检测是否使用错误的参数调用它。
当我使用patch.object(.., autospec=True, ..)
修补classmethod时,classmethod被替换为NonCallableMagicMock
并在我尝试调用它时引发错误。
from mock import patch
class A(object):
@classmethod
def api_meth(cls):
return cls._internal_classmethod(1, 2, 3)
@classmethod
def _internal_classmethod(cls, n, m, o):
return sum(n, m, o)
with patch.object(A, '_internal_classmethod') as p:
print(type(p).__name__)
with patch.object(A, '_internal_classmethod', autospec=True) as p:
print(type(p).__name__)
产生输出:
MagicMock
NonCallableMagicMock
如果_internal_classmethod
所属的类没有被模拟,我如何获得一个指定的模拟?
有一个突出的错误报告( 谷歌代码链接和python错误跟踪链接 )来解决这个问题。 在修复程序合并之前,您可以尝试以下方法,这对我有用[在2.7
,尽管我认为它也适用于3.x
]。
def _patched_callable(obj):
"Monkeypatch to allow autospec'ed classmethods and staticmethods."
# See https://code.google.com/p/mock/issues/detail?id=241 and
# http://bugs.python.org/issue23078 for the relevant bugs this
# monkeypatch fixes
if isinstance(obj, type):
return True
if getattr(obj, '__call__', None) is not None:
return True
if (isinstance(obj, (staticmethod, classmethod))
and mock._callable(obj.__func__)):
return True
return False
_patched_callable._old_func = mock._callable
mock._callable = _patched_callable
在monkeypatch之后,你应该能够正常使用mock.patch
并正确修补mock.patch
和类方法。
使用spec
代替autospec
,并直接设置。
with patch.object(A, '_internal_classmethod', spec=A._internal_classmethod) as p:
print(type(p).__name__)
给我
MagicMock
输出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.