返回作为参数传递的相同值的模拟方法

Mur*_*a Z 3 python unit-testing mocking python-mock

我如何使用 python 模拟 python 方法unittest.mock,它将返回作为参数传递的相同值,

我试过,

from unittest.mock import MagicMock

def dummy_function(value):
    "Will return same value as value passed to the function"
    return value

# To moke gettext function used in template
# Then I pass this mock method to Jinja2 template to moke gettext string
_ = MagicMock(return_value=dummy_function)
Run Code Online (Sandbox Code Playgroud)

当我打印 jinja 模板时,它会显示如下所示的测试,

<div class="order_details">\n                
<legend class="badge">&lt;function dummy_function at 0x10887f730&gt;</legend>\n            
</div>\n 
Run Code Online (Sandbox Code Playgroud)

原始 Jinja2 模板有

<div class="order_details">             
<legend class="badge">_('Details')</legend>           
</div>
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 7

return_value只是一个要返回的固定对象,而您只是告诉模拟调用的结果是一个函数对象。

您想改用该side_effect属性

_ = MagicMock(side_effect=dummy_function)
Run Code Online (Sandbox Code Playgroud)

设置side_effect为函数会导致使用与模拟相同的参数调用它。请参阅文档

如果你传入一个函数,它将使用与模拟相同的参数被调用,除非函数返回DEFAULT单例,否则对模拟的调用将返回函数返回的任何内容。

演示:

>>> from unittest.mock import MagicMock
>>> identity = lambda a: a
>>> MagicMock(return_value=identity)('called')  # returns the function object, it won't call it
<function <lambda> at 0x10fa61620>
>>> MagicMock(side_effect=identity)('called')   # will call the function
'called'
Run Code Online (Sandbox Code Playgroud)