Mocking python function based on input arguments Mocking python function based on input arguments python python

Mocking python function based on input arguments


If side_effect_func is a function then whatever that function returns iswhat calls to the mock return. The side_effect_func function is called withthe same arguments as the mock. This allows you to vary the returnvalue of the call dynamically, based on the input:

>>> 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


As indicated at Python Mock object with method called multiple times

A solution is to write my own 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

That does the trick


Side effect takes a function (which can also be a lambda function), so for simple cases you may use:

m = MagicMock(side_effect=(lambda x: x+1))