【问题标题】:Mock method which returns same value passed as argument返回作为参数传递的相同值的模拟方法
【发布时间】:2018-08-02 18:24:55
【问题描述】:

如何使用 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 

原来的 Jinja2 模板有

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

【问题讨论】:

    标签: python unit-testing mocking python-mock


    【解决方案1】:

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

    _ = MagicMock(return_value=dummy_function(somevalue))
    

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

    _ = MagicMock(return_value=somevalue)
    

    然后像你一样调用你的模拟。

    旁注:_ 使用而不是名称的目的是什么?你在嘲笑 gettext 吗?如果没有或者更清晰地给模拟命名,最好的 IMO 是将模拟命名为您正在模拟的真实函数以明确。

    【讨论】:

      【解决方案2】:

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

      您想改用side_effect attribute

      _ = MagicMock(side_effect=dummy_function)
      

      side_effect 设置为函数会导致调用它使用与模拟相同的参数。见documentation

      如果你传入一个函数,它将使用与模拟相同的参数调用,除非函数返回 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'
      

      【讨论】:

        猜你喜欢
        • 2013-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-18
        • 2022-10-15
        • 1970-01-01
        相关资源
        最近更新 更多