23

私はいくつかの単体テストを行っていますが、ある時点でsuper呼び出しをモックしてエラーをスローする必要があります。次に例を示します。

@classmethod
def myfunc(cls, *args, **kwargs)
    try:
        super(MyClass, cls).my_function(args, kwargs)
    except MyException as e:
        #...

一般にオブジェクトをモックするためにモッカーライブラリを使用していますが、これをモックする方法が見つかりません。

4

6 に答える 6

7

ハックのような方法を見つけましたが、うまくいきます。私の例で説明します。これはこの応答に基づいているので、@kindallに感謝します。

def my_test(self):
    import __builtin__
    from mocker import Mocker, KWARGS, ARGS

    mymocker = mocker.mock()
    mymocker.my_function(ARGS, KWARGS)
    mocker.throw(MyException)

    def mysuper(*args, **kwargs):
        if args and issubclass(MyClass, args[0]):
            return mymocker
        return original_super(*args, **kwargs)

    __builtin__.original_super = super
    __builtin__.super = mysuper

    with mocker:
        MyClass.myfunc()

superしたがって、基本的に私が行うことは、呼び出しがモックしたいクラスからのものかどうかを確認することです。それ以外の場合は、通常のsuper.

これが誰かを助けることを願っています:)

于 2012-10-26T20:37:56.877 に答える
1

Python 独自の Mock クラスは、それを支援する引数を提供します。spec

with mock.patch('...ParentClass.myfunc') as mocked_fn:
    mocked_fn.side_effect = MyException()  # Parent's method will raise
    instance = mock.Mock(spec=MyClass)  # Enables using super()
    MyClass.myfunc(instance)  # Will enter your `except` block
于 2020-03-03T02:33:04.657 に答える
0

では、爆破するmy_functionスーパークラスのメソッドをモックする必要があります。MyClass

于 2012-10-26T20:11:37.933 に答える