Python单元测试:如何打桩被测方法内部的异步调用
解决unittest.mock打桩异步函数不生效的问题
你的问题核心是patch的目标路径错误。在creations.py中,你已经直接导入了create_asset,此时该函数在creations模块内形成了本地引用。你当前patch的是原模块app.fakeapi.utils.create_asset,但不会影响creations模块里已经导入的那个引用,导致实际调用还是走了原函数。
修正方案
把patch的目标改为creations模块内的create_asset引用,也就是app.create.creations.create_asset:
修正后的test.py
import pytest from app.create.creations import generate_new_asset from unittest.mock import Mock, patch @patch("app.create.creations.create_asset") @pytest.mark.anyio async def test_generate_new_asset(mock_create): # 异步函数的Mock可以直接设置return_value,Mock会自动处理为可await对象 mock_create.return_value = 12345678 result = await generate_new_asset() # 添加断言验证mock行为 mock_create.assert_called_once() assert result == 12345678
可选优化:使用AsyncMock
如果需要更明确地模拟异步函数,可以用AsyncMock(Python 3.8+支持),效果和普通Mock一致,但语义更清晰:
from unittest.mock import AsyncMock, patch @patch("app.create.creations.create_asset", new_callable=AsyncMock) @pytest.mark.anyio async def test_generate_new_asset(mock_create): mock_create.return_value = 12345678 result = await generate_new_asset() mock_create.assert_called_once() assert result == 12345678
内容的提问来源于stack exchange,提问作者red
相关产品推荐
相关产品推荐

