我想拦截函数内部发生的函数调用。这是为了制作一个"模拟"对函数内函数调用的影响。
例如:
def calls_add(a,b):
print "this function calls add"
c = add(a,b)
print "call to add returned",c
我想在call_add之上添加一个装饰器来拦截对函数add的调用,而不是调用其他函数(使用相同的参数传递给add)
这样的事情:
def some_other_func(*args,**kwargs):
return "test value"
@mock(add,some_other_func)
def calls_add(a,b):
print "this function calls add"
c = add(a,b)
print "call to add returned",c
有没有办法在不必触及calls_add代码的情况下执行此操作。我正在查看检查库但需要帮助。
答案 0 :(得分:0)
我认为您正在寻找unittest.mock.patch
:
patch()充当函数装饰器,类装饰器或上下文管理器。在函数体或with语句的主体内部,使用新对象修补目标。当函数/ with语句退出补丁时,撤消。
答案 1 :(得分:0)
您必须使用mock.patch
。您有以下两个可能性:
如果你想使用装饰器:
import mock
def some_other_func(*args, **kwargs):
return "test value"
def add(a, b):
return a + b
@mock.patch("__main__.add", some_other_func)
def calls_add(a, b):
print "this function calls add"
c = add(a, b)
print "call to add returned", c
calls_add(1, 2)
如果您不想使用装饰器:
import mock
def some_other_func(*args, **kwargs):
return "test value"
def add(a, b):
return a + b
def calls_add(a, b):
print "this function calls add"
c = add(a, b)
print "call to add returned", c
calls_add(1, 2)
with mock.patch("__main__.add", some_other_func):
calls_add(1, 2)