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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 3: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.foo(2) == 20
    assert o.foo(1) == 10
答案

由于您需要动态更改返回值,因此需要使用side_effect而不是return_value。您可以将所需的返回值映射到预期的输入,并使用此映射/字典的.get函数作为副作用:

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

演示:

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

以上是关于Python 3:unittest.mock如何为特定输入指定不同的返回值?的主要内容,如果未能解决你的问题,请参考以下文章

使用 unittest.mock 在 python 中修补 SMTP 客户端

使用unittest.mock在python中修补SMTP客户端

Python unittest mock:是不是可以在测试时模拟 __init__ 的默认参数的值?

使用 unittest.mock.patch 测试 aiohttp 客户端

UnitTest, Mock整数类型返回NPE(null)报错

如何为 Python 2 和 3 上传通用 Python Wheel?