【发布时间】:2015-07-31 22:37:11
【问题描述】:
我想修改传递给模块中方法的参数,而不是替换它的返回值。
我找到了解决这个问题的方法,但它似乎很有用,并且已经变成了嘲笑的教训。
模块.py
from third_party import ThirdPartyClass
ThirdPartyClass.do_something('foo', 'bar')
ThirdPartyClass.do_something('foo', 'baz')
tests.py
@mock.patch('module.ThirdPartyClass.do_something')
def test(do_something):
# Instead of directly overriding its return value
# I'd like to modify the arguments passed to this function.
# change return value, no matter inputs
do_something.return_value = 'foo'
# change return value, based on inputs, but have no access to the original function
do_something.side_effect = lambda x, y: y, x
# how can I wrap do_something, so that I can modify its inputs and pass it back to the original function?
# much like a decorator?
我尝试过类似以下的方法,但它不仅重复且丑陋,而且不起作用。经过一些 PDB 内省之后.. 我想知道这是否仅仅是因为这个第三方库的工作原理,因为当我将 pdb 放入 side_effect 时,我确实看到原始函数被成功调用。
要么是那个,要么是一些我不喜欢学习的自动嘲弄魔法。
def test():
from third_party import ThirdPartyClass
original_do_something = ThirdPartyClass.do_something
with mock.patch('module.ThirdPartyClass.do_something' as mocked_do_something:
def side_effect(arg1, arg2):
return original_do_something(arg1, 'overridden')
mocked_do_something.side_effect = side_effect
# execute module.py
感谢任何指导!
【问题讨论】:
-
你为什么说它不起作用。行为是什么? AFAIK 它应该可以工作,我用这种方式 more times... 我可以解释其他细节,但在提交答案之前,我想知道为什么 ugly 方式不能按预期工作。