【问题标题】:Return different mock results for the same call within a function in pytest在 pytest 中的函数内为同一调用返回不同的模拟结果
【发布时间】:2021-07-19 23:58:10
【问题描述】:

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

@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(如果这有意义的话)。

【问题讨论】:

标签: python mocking pytest


【解决方案1】:

mock 的side_effect 属性可以包含一个可迭代对象——可迭代对象中的每一项都将按顺序返回:

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

将此与您的示例相结合:

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

【讨论】:

    猜你喜欢
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    相关资源
    最近更新 更多