【问题标题】:Python 3: unittest.mock how to specify different return values for specific inputs?Python 3:unittest.mock 如何为特定输入指定不同的返回值?
【发布时间】:2017-12-24 03:22:31
【问题描述】:

假设我有一个模拟对象(让它成为 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

【问题讨论】:

    标签: python python-3.x mocking python-unittest


    【解决方案1】:

    由于您需要动态更改返回值,因此您需要使用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
    

    【讨论】:

    • 如果该方法只接受一个参数,这将正常工作,如果该方法接受多个参数怎么办?喜欢:m.foo(param1, param2, param3),我也希望使用unittest.mock.ANY 作为参数之一。
    猜你喜欢
    • 1970-01-01
    • 2022-01-03
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多