[TIP] Return different values based on an argument passed to a method

Michael Foord michael at voidspace.org.uk
Mon Mar 5 04:41:57 PST 2012

On 05/03/2012 12:33, Marcin Zajączkowski wrote:
> Hi,
> Is it possible to simple stub a method's return value when called with an argument (any argument or specific one)?
> I tried with:
> mock = Mock()
> mock.foo(ANY).return_value(False)
> but in a debugger I see that in my code mock.foo(<<some_object>>) returns a mock instead of False value. If not the returning value I could use assert_called_with with custom mather, but how to return different value based on an argument?

To change the return value of mock.foo you set mock.foo.return_value.

mock.foo(ANY).return_value(False)  is fetching the return_value mock got 
by calling mock.foo - and then calling that mock with False! (You're not 
setting any return_value at all, you're just making calls.)

To have mock.foo return False, do this:

     mock.foo.return_value = False

It's not entirely clear to me from your post, but if you want to you can 
dynamically change the value returned from a call using side_effect.

 >>> from mock import MagicMock
 >>> def side_effect(arg):
...      if arg == 1:
...          return False
...      return True
 >>> m = MagicMock()
 >>> m.foo.side_effect = side_effect
 >>> m.foo(1)
 >>> m.foo(37)

All the best,

Michael Foord

> Regards
> Marcin
> _______________________________________________
> testing-in-python mailing list
> testing-in-python at lists.idyll.org
> http://lists.idyll.org/listinfo/testing-in-python


May you do good and not evil
May you find forgiveness for yourself and forgive others
May you share freely, never taking more than you give.
-- the sqlite blessing http://www.sqlite.org/different.html

More information about the testing-in-python mailing list