首页 > 解决方案 > 在 pytest 中的函数内为同一调用返回不同的模拟结果

问题描述

我有一个测试函数,我成功地修补了一个函数调用以返回一个模拟结果。它适用于调用修补函数的一次:

@patch(‘db.get_session’)
def test_some_function(mock_session):
    mock_session.return_value.query.return_value = MockResult(1)
    assert some_function()

但是,我正在尝试测试一个多次使用 get_session().query() 的函数,并且每次都应该返回不同的结果。我不知道如何嘲笑这个。

@patch(‘db.get_session’)
def test_some_other_function(mock_session):
    # First call should return one
    mock_session.return_value.query.return_value = MockResult(1)
    # Second call should return no results:
    mock_session.return_value.query.return_value = MockResult(0)
    assert some_other_function()

def some_other_function():
    session = get_session()
    one = session.query('some_query')
    zero = session.query('some_other_query')
    if one == 1 and zero == 0:
        return True

我已经看过了,side_effect但我不确定如何设置它,因为我没有更改直接的 return_value 而是更改 return_value 的 return_value (如果这有意义的话)。

标签: pythonmockingpytest

解决方案


mock的side_effect属性可以包含一个 iterable - iterable 中的每个项目将按顺序返回:

>>> m = mock.Mock(side_effect=(1, 2))
>>> m()
1
>>> m()
2

将此与您的示例相结合:

    mock_session.return_value.query.side_effect = (MockResult(1), MockResult(0))

推荐阅读