Python 检查函数是否在未更改其行为的情况下被调用
我如何测试调用了python函数,而根本不改变其行为 有许多相关的帖子,但我找不到其中一篇涵盖所有内容:Python 检查函数是否在未更改其行为的情况下被调用,python,python-3.x,Python,Python 3.x,我如何测试调用了python函数,而根本不改变其行为 有许多相关的帖子,但我找不到其中一篇涵盖所有内容: (改变行为) (不适用于参数和返回值) 基本上,我只需要监视这个函数,就可以知道它是否被调用了 例如,下面的代码片段具有非常令人惊讶的行为 from unittest.mock import patch def func(a,b): print('was called') return a * b with patch('test.func') as patched_
- (改变行为)
- (不适用于参数和返回值)
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
您应该为函数创建一个装饰器,如下所示:
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
第一次调用时,使用设置为
True
的全局变量?如果func
位于无法修改的模块内,则该全局变量不起作用,这几乎总是修补时需要的。您还可以使用全局变量作为函数调用次数的计数器。类似于:def func(i):i+=1
我无法修改func
,它不在我的代码库中。看到我上面的评论,我想它已经在unittest中实现了。如果使用unittest没有答案,我将接受你的答案
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