2017-08-02 59 views
1

如何测试python函数被调用,而不改变它的行为检查函数是否在不改变其行为的情况下被调用

有很多相关的帖子,但我找不到他们中的一个,涵盖了一切:

基本上,我只是需要监视函数来知道它是否被调用。

例如,下面的代码片段具有非常令人惊讶的行为

from unittest.mock import patch 

def func(a,b): 
    print('was called') 
    return a * b 

with patch('test.func') as patched_function: 
    print(func(4,5)) 

print(patched_function.called) 

输出:

<MagicMock name='func()' id='1721737249456'> 
True 
was called 
20 
False 

虽然我只是期待

was called 
20 
True 
+0

使用您在第一次调用设置为TRUE;一个全局变量? –

+0

如果'func'在一个你不能修改的模块内,这几乎总是你在修补时要查找的内容 – Overdrivr

+0

你也可以使用一个全局变量作为计数器的次数一个函数被调用。例如:'def func(i):i + = 1' –

回答

1

你应该为函数创建一个装饰像这样:

class CheckCall(object): 
    called = False 

    def __init__(self, func): 
     self.func = func 

    def __call__(self *args, **kwargs): 
     self.called = True 
     return self.func(*args, **kwargs) 

那么你可以申请你的装饰,像这样

with patch('test.func') as patched_function: 
    patched_function = CheckCall(patched_function) 
    print(patched_function.called) # Prints False 
    patched_function(...) 
    print(patched_function.called) # Prints True 
+0

我认为它已经在单元测试中实现了。如果使用unittest没有答案,我会接受你的 – Overdrivr

相关问题