python - 在 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 (如果这有意义的话)。
解决方案
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))
推荐阅读
- c# - C# WPF XAML 工具包,单击按钮切换视图
- mysql - INDEX 没有改善 sql 查询结果
- arrays - 如何使用 json 对象中的数组以及不在 json 对象中的数组在 React 应用程序中设置状态?
- git - Git flow-需要从另一个分支创建功能分支
- javascript - 在 mouseenter 上使用 javascript 旋转 div 并将它们旋转回 mouseleave 上的原始位置
- javascript - 条目存在时删除 Typescript 界面列表中的元素,始终显示负索引
- spring-mvc - 当 HTML 没有“PUT”时,如何以“PUT”方法发送文件?
- c++ - Eigen::Map 未命名?
- wordpress - WP REST API 无法设置帖子标签
- c - 函数指针地址总是静态的吗?