Python Mock object with method called multiple times Python Mock object with method called multiple times python python

Python Mock object with method called multiple times


Try 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


A little sweeter:

mockobj.method.side_effect = lambda x: {123: 100, 234: 10000}[x]

or for multiple arguments:

mockobj.method.side_effect = lambda *x: {(123, 234): 100, (234, 345): 10000}[x]

or with a default value:

mockobj.method.side_effect = lambda x: {123: 100, 234: 10000}.get(x, 20000)

or a combination of both:

mockobj.method.side_effect = lambda *x: {(123, 234): 100, (234, 345): 10000}.get(x, 20000)

and merrily on high we go.


I've ran into this when I was doing my own testing. If you don't care about capturing calls to your methodfromdepclass() but just need it to return something, then the following may suffice:

def makeFakeMethod(mapping={}):    def fakeMethod(inputParam):        return mapping[inputParam] if inputParam in mapping else MagicMock()    return fakeMethodmapping = {42:"Called with 42", 59:"Called with 59"}mockobj.methodfromdepclass = makeFakeMethod(mapping)

Here's a parameterized version:

def makeFakeMethod():    def fakeMethod(param):        return "Called with " + str(param)    return fakeMethod