【问题标题】:How to user Python Mock side effect to return different value based on function being mocked如何使用 Python Mock 副作用根据被模拟的函数返回不同的值
【发布时间】:2019-08-16 02:57:45
【问题描述】:

我有一个通用函数,我想将它用作两个不同函数的副作用。根据被模拟的函数,它们应该返回不同的值。 代码是:

def sleep_three(*args, **kwargs):
    logging.info('Sleeping 3 seconds')
    time.sleep(3)

用作两个不同功能的副作用:

 self.foo.side_effect = sleep_three
 self.bar.side_effect = sleep_three

对于 foo,我想要一个特定的返回值,而对于 bar,我想要一个不同的返回值。我知道如何根据传递给 side_effect 函数的不同参数获得不同的返回值。在这种情况下,虽然 foo 和 bar 都在同一个参数中传递,但它们只需要返回不同的值。

我的选择是:

  1. 为 side_effect 编写两个不同的函数:sleep_three_foo 和 sleep_three_bar,然后相应地匹配返回值。但这违反了 DRY 原则,我想避免它。

  2. 我的问题是:sleep_three 中有没有办法获得被模拟的原始函数?

类似

if original_mocked_function == foo:
    return a
elif original_mocked_function == bar:
    return b

任何指针表示赞赏!

【问题讨论】:

  • sleep_three_foosleep_three_bar 有什么不同?您可以编写一个基于某个参数生成正确函数的函数,然后编写self.foo.side_effect = make_mock(...); self.bar.side_effect = make_mock(...)

标签: python unit-testing python-mock


【解决方案1】:

定义一个函数,将副作用函数的期望返回值作为参数并返回适当的函数。

def make_sleeper(rv):
    def _(*args, **kwargs):
        logging.info("Sleeping 3 seconds")
        time.sleep(3)
        return rv
    return _

self.foo.side_effect = make_sleeper(5)
self.bar.side_effect = make_sleeper(9)

【讨论】:

  • 感谢@chepner,使用闭包解决了问题!
猜你喜欢
  • 2014-09-08
  • 2015-09-09
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 2020-04-06
  • 2020-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多