如何使用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"><function dummy_function at 0x10887f730></legend>\n
</div>\n
Orignal Jinja2模板
<div class="order_details">
<legend class="badge">_('Details')</legend>
</div>
答案 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就是将模拟命名为你正在嘲笑的真实函数。