如何用pytest测试接收函数参数的方法并断言调用情况?
测试Callable参数的最优方案:使用Mock对象
直接用Python标准库的unittest.mock.Mock(或pytest专属的pytest-mock fixture)就能完美解决你的问题,Mock本身就是Callable类型,会自动记录所有调用细节,包括调用次数、传入参数,无需自定义多个空函数。
方案1:使用标准库unittest.mock.Mock
from unittest.mock import Mock from your_module import Certificate def test_certificate_upload_calls_callback(): # 创建Mock对象(本身就是Callable) mock_callback = Mock() cert = Certificate() # 调用upload方法,传入mock回调 cert.upload(mock_callback) # 断言回调被调用过 assert mock_callback.called # 断言回调被调用了1次 mock_callback.assert_called_once() # 如果upload会给回调传特定参数,还能断言参数匹配 # mock_callback.assert_called_with(expected_arg1, expected_arg2)
方案2:使用pytest-mock fixture(更简洁)
如果你的项目已经用pytest,推荐用pytest-mock提供的mocker fixture,它封装了unittest.mock,无需手动导入Mock,还会自动清理mock对象:
from your_module import Certificate def test_certificate_upload_with_mocker(mocker): # 创建mock回调 mock_callback = mocker.Mock() cert = Certificate() cert.upload(mock_callback) # 断言调用次数 mock_callback.assert_called_once() # 检查调用时的参数(比如upload给回调传了"cert_data") assert mock_callback.call_args == mocker.call("cert_data")
关键优势
- 无需为不同场景写多个空函数,一个Mock对象就能复用
- 直接通过Mock的内置方法断言:
assert_called()、assert_called_once()、assert_called_with()、assert_called_once_with() - 可以通过
mock_callback.call_count获取调用次数,mock_callback.call_args获取最后一次调用的参数,mock_callback.call_args_list获取所有调用的参数列表
内容的提问来源于stack exchange,提问作者BL_NK
相关产品推荐
相关产品推荐

