Python 3:unittest.mock如何为特定输入指定不同的返回值?
假设我有一个mock对象(让它成为mock或MagicMock)。我想模拟它的一个方法,为一个特定的输入返回一个值,为另一个特定的输入返回另一个值。我如何做到这一点而不必关心输入发送到方法的顺序 伪代码: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
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