我正在用 Python 编程,我想知道我是否可以测试我的代码中是否调用了一个函数
def example():
pass
example()
#Pseudocode:
if example.has_been_called:
print("foo bar")
我该怎么做?
原文由 Billjk 发布,翻译遵循 CC BY-SA 4.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 许可协议
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.4k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
2 回答2k 阅读✓ 已解决
如果函数知道自己的名字是可以的,你可以使用一个函数属性:
您还可以使用装饰器来设置属性: