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

时间:2018-02-22 19:00:25

标签: python unit-testing mocking python-mock

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

我试过了,

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)

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

<div class="order_details">\n                
<legend class="badge">&lt;function dummy_function at 0x10887f730&gt;</legend>\n            
</div>\n 

Orignal Jinja2模板

<div class="order_details">             
<legend class="badge">_('Details')</legend>           
</div>

2 个答案:

答案 0 :(得分:4)

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

您想要使用side_effect attribute代替:

_ = MagicMock(side_effect=dummy_function)

side_effect设置为函数会使其被称为,其参数与模拟相同。请参阅documentation

  

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

演示:

>>> 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'

答案 1 :(得分:0)

您直接将函数对象作为返回值传递,这就是它打印函数repr(名称和内存地址)的原因。你需要传递你想要的实际值作为回报,所以:

_ = MagicMock(return_value=dummy_function(somevalue))

但是如果函数总是返回传递的值,那么它是无用的,创建一个模拟已经足够了所以可能只是这样做:

_ = MagicMock(return_value=somevalue)

然后像你一样打电话给你的模拟器。

旁注:_使用的目的是什么,而不是名称?你在嘲笑gettext吗?如果没有,或者为模拟器命名会更干净,那么最好的IMO就是将模拟命名为你正在嘲笑的真实函数。