11

我想断言 Python 类中的一个类方法使用一组参数调用另一个类方法。我希望模拟的类方法是“规范的”,因此它会检测是否使用错误数量的参数调用它。

当我使用 修补类方法patch.object(.., autospec=True, ..)时,类方法被替换为 aNonCallableMagicMock并在我尝试调用它时引发错误。

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当它所属的类没有被模拟时,我怎样才能得到一个规范的模拟?

4

2 回答 2

7

有一个出色的错误报告(谷歌代码链接python 错误跟踪器链接)来解决这个问题。在修复被合并之前,您可以尝试以下方法,这对我有用 [On 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

在猴子补丁之后,您应该能够mock.patch正常使用并正确修补静态和类方法。

于 2015-06-02T16:48:17.270 回答
5

代替specautospec直接设置。

with patch.object(A, '_internal_classmethod', spec=A._internal_classmethod) as p:
    print(type(p).__name__)

给我

MagicMock

用于输出。

于 2014-09-17T19:29:41.630 回答