如何在pytest中用mocker为函数原结果添加side_effect
解决方案
要实现先调用原函数获取结果、再将结果传入side_effect处理的需求,你需要自定义一个副作用函数,在内部先调用原函数,再把原结果传给modify处理。具体实现如下:
修改后的测试代码
def test_fnc(): # 获取原函数的引用(路径需与patch目标完全一致) original_otherfnc = app.path.otherfnc # 自定义副作用函数:先执行原函数拿到结果,再传入处理函数 def custom_side_effect(): original_result = original_otherfnc() return modify(original_result) # 将自定义函数作为side_effect传入patch mocker.patch('app.path.otherfnc', side_effect=custom_side_effect) result = fnc() assert result == "6"
原问题原因说明
你之前直接将modify设为side_effect的问题在于:
mocker.patch会用MagicMock直接替换原函数,原函数不会被执行modify需要接收一个参数,但被替换后的otherfnc是无参调用,导致modify无法获取原函数的返回值,甚至会因参数缺失报错
通过自定义副作用函数,我们手动触发原函数的执行,再将结果传递给处理函数,就能实现预期的逻辑。
内容的提问来源于stack exchange,提问作者Azzten
相关产品推荐
相关产品推荐

