You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 01:41:01