拦截函数调用走出函数python

时间:2016-06-17 10:23:24

标签: python mocking pytest

我想拦截函数内部发生的函数调用。这是为了制作一个"模拟"对函数内函数调用的影响。

例如:

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代码的情况下执行此操作。我正在查看检查库但需要帮助。

2 个答案:

答案 0 :(得分:0)

我认为您正在寻找unittest.mock.patch

  

patch()充当函数装饰器,类装饰器或上下文管理器。在函数体或with语句的主体内部,使用新对象修补目标。当函数/ with语句退出补丁时,撤消。

来自API here和文档here

答案 1 :(得分:0)

您必须使用mock.patch。您有以下两个可能性:

  1. 如果你想使用装饰器:

    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)
    
  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)