Python 3:unittest.mock如何为特定输入指定不同的返回值?

Python 3:unittest.mock如何为特定输入指定不同的返回值?,python,python-3.x,mocking,python-unittest,Python,Python 3.x,Mocking,Python Unittest,假设我有一个mock对象(让它成为mock或MagicMock)。我想模拟它的一个方法,为一个特定的输入返回一个值,为另一个特定的输入返回另一个值。我如何做到这一点而不必关心输入发送到方法的顺序 伪代码: def test_blah(): o = MagicMock() # How to do I these? o.foo.return_value.on(1) = 10 o.foo.return_value.on(2) = 20 assert o.fo

假设我有一个mock对象(让它成为mock或MagicMock)。我想模拟它的一个方法,为一个特定的输入返回一个值,为另一个特定的输入返回另一个值。我如何做到这一点而不必关心输入发送到方法的顺序

伪代码:

def test_blah():
    o = MagicMock()

    # How to do I these?
    o.foo.return_value.on(1) = 10
    o.foo.return_value.on(2) = 20

    assert o.foo(2) == 20
    assert o.foo(1) == 10
由于需要动态更改返回值,因此需要使用而不是
返回值
。您可以将所需的返回值映射到所需的输入,并使用此映射/字典的
.get
功能作为副作用:

return_values = {1: 10, 2: 20}
o.foo.side_effect = return_values.get
演示:


如果该方法只接受一个参数,那么这将很好,如果该方法接受多个参数呢?比如:
m.foo(param1,param2,param3)
,我还希望对其中一个参数使用
unittest.mock.ANY
In [1]: from unittest import mock

In [2]: m = mock.MagicMock()

In [3]: return_values = {1: 10, 2: 20}

In [4]: m.foo.side_effect = return_values.get

In [5]: m.foo(1)
Out[5]: 10

In [6]: m.foo(2)
Out[6]: 20