[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)
False
 >>> m.foo(37)
True

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
>


-- 
http://www.voidspace.org.uk/

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