无需逐一Mock,如何在复杂调用中追踪函数调用并验证调用情况?
测试复杂函数中指定函数的调用情况
我完全不在意执行过程中出现的任何异常,现在需要测试一个会调用多个子函数的复杂函数:验证在传入特定输入参数时,某些指定的嵌套函数是否被正确调用。
思路一:捕获异常并验证Mock调用
通过@patch替换目标函数为异步Mock,执行复杂函数时捕获所有异常,最后验证指定Mock的调用情况:
@patch( "service.module.class.some_nested_function_1", new_callable=AsyncMock, ) @patch( "service.module.class.some_nested_function_2", new_callable=AsyncMock, ) @pytest.mark.asyncio async def test_complex_function(function2_mock, function1_mock): some_param = "abc" another_param = "xyz" try: call_complex_function("with_some_configuration") except: abort_crashing_function_and_continue_execution_in_complex_function() assert function2_mock.assert_called_once_with(some_param) assert function1_mock.assert_called_once_with(another_param)
思路二:Mock所有无关函数避免异常
通过Mock除复杂函数本身之外的所有函数调用,让它们返回默认值(比如0),这样执行复杂函数时不会触发异常,直接验证指定Mock的调用情况:
... async def test_complex_function(function2_mock, function1_mock): ... mock_every_function_call_except_complex_function_to_return_zero() call_complex_function("with_some_configuration") assert function2_mock.assert_called_once_with(some_param) assert function1_mock.assert_called_once_with(another_param) ... ...
内容的提问来源于stack exchange,提问作者c0mr4t
相关产品推荐
相关产品推荐

