11

Python クラスの 1 つのクラスメソッドが、特定の引数セットを使用して別のクラスメソッドを呼び出すことを主張したいと思います。モック化されたクラスメソッドを「仕様化」したいので、間違った数の引数で呼び出されたかどうかを検出します。

を使用してクラスメソッドにパッチを適用するpatch.object(.., autospec=True, ..)と、クラスメソッドが に置き換えられ、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属するクラスがモックされていない場合、仕様化されたモックを取得するにはどうすればよいですか?

4

2 に答える 2

7

この問題を解決するための未解決のバグ レポート ( Google コード リンク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

モンキーパッチの後、通常どおり使用できるようになり、静的mock.patchメソッドとクラスメソッドに適切にパッチが適用されるはずです。

于 2015-06-02T16:48:17.270 に答える
5

specの代わりに使用しautospec、直接設定してください。

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

私にくれます

MagicMock

出力用。

于 2014-09-17T19:29:41.630 に答える