【问题标题】:Check if function was called without changing its behavior [duplicate]检查函数是否被调用而不改变其行为[重复]
【发布时间】:2017-08-02 12:03:10
【问题描述】:

我如何测试 Python 函数是否被调用,完全不改变其行为

有很多相关的帖子,但我找不到涵盖所有内容的帖子:

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

例如,以下 sn-p 具有极其令人惊讶的行为

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

【问题讨论】:

  • 使用您在第一次调用时设置为True 的全局变量?
  • 如果 func 位于您无法修改的模块中,则不起作用,这几乎总是您在修补时要查找的内容
  • 你也可以使用一个全局变量作为一个函数被调用次数的计数器。比如:def func(i): i+=1
  • 我无法修改func,它不在我的代码库中。见我上面的评论

标签: python python-3.x


【解决方案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

【讨论】:

  • 我以为它已经在 unittest 中实现了。如果使用 unittest 没有答案,我会接受你的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-01
  • 1970-01-01
  • 2011-09-08
  • 2011-03-30
  • 2021-12-11
相关资源
最近更新 更多