215

しばらくの間、 Mock for python を使用しています。

今、関数をモックしたい状況があります

def foo(self, my_param):
    #do something here, assign something to my_result
    return my_result

通常、これをモックする方法は次のようになります (foo がオブジェクトの一部であると仮定)

self.foo = MagicMock(return_value="mocked!")

foo() を数回呼び出すと、使用できます

self.foo = MagicMock(side_effect=["mocked once", "mocked twice!"])

現在、入力パラメータが特定の値の場合に固定値を返したいという状況に直面しています。したがって、「my_param」が「何か」と等しい場合、「my_cool_mock」を返したいとします。

これは、python用のmockitoで利用できるようです

when(dummy).foo("something").thenReturn("my_cool_mock")

私はモックで同じことを達成する方法を探していましたが、成功しませんでしたか?

何か案は?

4

9 に答える 9

262

が関数の場合side_effect_func、その関数が返すものは何でも、モックの戻り値を呼び出すものです。side_effect_func関数はモックと同じ引数で呼び出されます。これにより、入力に基づいて呼び出しの戻り値を動的に変えることができます。

>>> def side_effect_func(value):
...     return value + 1
...
>>> m = MagicMock(side_effect=side_effect_func)
>>> m(1)
2
>>> m(2)
3
>>> m.mock_calls
[call(1), call(2)]

http://www.voidspace.org.uk/python/mock/mock.html#calling

于 2013-04-23T06:05:45.360 に答える
76

メソッドが複数回呼び出される Python Mock object で示されているように

解決策は、独自の side_effect を作成することです

def my_side_effect(*args, **kwargs):
    if args[0] == 42:
        return "Called with 42"
    elif args[0] == 43:
        return "Called with 43"
    elif kwargs['foo'] == 7:
        return "Foo is seven"

mockobj.mockmethod.side_effect = my_side_effect

それはトリックを行います

于 2013-04-23T06:19:43.397 に答える