如何根据被模拟的函数将 Python 模拟副作用 return 不同的值
How to user Python Mock side effect to return different value based on function being mocked
我有一个通用函数,我想将其用作两个不同函数的副作用。基于被模拟的函数,它们应该 return 不同的值。
代码是:
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,我想要一个特定的 return 值,而对于 bar 我想要一个不同的 return 值。我知道如何根据传递给 side_effect 函数的不同参数获取不同的 return 值。在这种情况下,虽然 foo 和 bar 都在同一个参数中传递,但它们只需要 return 不同的值。
我的选择是:
为 side_effect 编写两个不同的函数:sleep_three_foo 和 sleep_three_bar,然后相应地匹配 return 值。这违反了 DRY 原则,我想避免它。
我的问题是:在 sleep_three 中有没有办法获得被模拟的原始函数?
类似
if original_mocked_function == foo:
return a
elif original_mocked_function == bar:
return b
感谢任何指点!
定义一个函数,该函数将副作用函数的所需 return 值作为参数并 return 适当的函数。
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)
我有一个通用函数,我想将其用作两个不同函数的副作用。基于被模拟的函数,它们应该 return 不同的值。 代码是:
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,我想要一个特定的 return 值,而对于 bar 我想要一个不同的 return 值。我知道如何根据传递给 side_effect 函数的不同参数获取不同的 return 值。在这种情况下,虽然 foo 和 bar 都在同一个参数中传递,但它们只需要 return 不同的值。
我的选择是:
为 side_effect 编写两个不同的函数:sleep_three_foo 和 sleep_three_bar,然后相应地匹配 return 值。这违反了 DRY 原则,我想避免它。
我的问题是:在 sleep_three 中有没有办法获得被模拟的原始函数?
类似
if original_mocked_function == foo:
return a
elif original_mocked_function == bar:
return b
感谢任何指点!
定义一个函数,该函数将副作用函数的所需 return 值作为参数并 return 适当的函数。
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)