查看函数是否被调用

新手上路,请多包涵

我正在用 Python 编程,我想知道我是否可以测试我的代码中是否调用了一个函数

def example():
    pass
example()
#Pseudocode:
if example.has_been_called:
   print("foo bar")

我该怎么做?

原文由 Billjk 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

如果函数知道自己的名字是可以的,你可以使用一个函数属性:

 def example():
    example.has_been_called = True
    pass
example.has_been_called = False

example()

#Actual Code!:
if example.has_been_called:
   print("foo bar")

您还可以使用装饰器来设置属性:

 import functools

def trackcalls(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        wrapper.has_been_called = True
        return func(*args, **kwargs)
    wrapper.has_been_called = False
    return wrapper

@trackcalls
def example():
    pass

example()

#Actual Code!:
if example.has_been_called:
   print("foo bar")

原文由 agf 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用标准库中的 unittest.mock.Mock 的最小示例:

 from unittest.mock import Mock

def example():
    pass

example_mock = Mock(side_effect=example)
example_mock()
#Pseudocode:
if example_mock.called:
   print("foo bar")

运行脚本后的控制台输出:

 foo bar

这种方法很好,因为它不需要您修改 example 函数本身,如果您想在某些单元测试代码中执行此检查而不修改源代码本身(EG 到存储 has_been_called 属性,或将函数包装在装饰器中)。

解释

unittest.mock.Mock 类的文档中所述side_effect 参数到 --- 参数指定“调用构造函数的 Mock() ”。

Mock.called 属性指定“表示是否已调用模拟对象的布尔值”。

Mock 类还有其他您可能会觉得有用的属性,例如:

call_count :一个整数告诉你模拟对象被调用了多少次

call_args :这要么是 None(如果还没有调用模拟),要么是上次调用模拟的参数

call_args_list :这是按顺序对模拟对象进行的所有调用的列表(因此列表的长度是它被调用的次数)。在进行任何调用之前,它是一个空列表

Mock 类也有方便的方法来根据 Mock 对象被调用的次数以及调用它的参数来制作断言语句,例如:

assert_called_once_with(*args, **kwargs) : 断言模拟只被调用一次,并且该调用使用了指定的参数

原文由 Jake Levi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题