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

如何测试异步函数并Patch调用的类?解决ModuleNotFoundError

解决导入错误与完成异步测试

步骤1:修复包结构错误

首先修正project/modules下的文件名错误:将__init__.py.py重命名为__init__.py,确保modules是有效的Python包。

步骤2:调整主模块的导入路径

修改project/main.py中的导入语句,使用绝对导入替代相对导入,让Python能正确定位模块:

import asyncio

# 替换原相对导入语句
from project.modules.module import My_Class

async def main():
    my_class = My_Class()

if __name__ == "__main__":
    asyncio.run(main())

步骤3:修正测试中的Patch路径并完善测试

根据unittest.mock的规则,需要Patch被测试代码实际引用的对象位置(即main.py中导入的My_Class实例)。修改后的tests/test_main.py如下:

import pytest
from unittest.mock import patch

from project.main import main

@pytest.mark.asyncio
@patch("project.main.My_Class")  # Patch main模块内的My_Class引用
async def test_main(mock_my_class):
    await main()
    # 添加断言验证类是否被正确实例化
    mock_my_class.assert_called_once()

可选:通过添加PYTHONPATH解决(不推荐)

如果不想修改main.py的导入语句,可以在测试文件开头将项目根目录加入Python路径:

import sys
from pathlib import Path

# 将包含project的根目录添加到sys.path
sys.path.append(str(Path(__file__).parent.parent))

import pytest
from unittest.mock import patch

from project.main import main

@pytest.mark.asyncio
@patch("project.modules.module.My_Class")
async def test_main(mock_my_class):
    await main()
    mock_my_class.assert_called_once()

运行测试

在包含project和tests的根目录下执行命令:

pytest tests/test_main.py -v

测试会成功运行,同时验证My_Class被正确Mock并实例化。

内容的提问来源于stack exchange,提问作者Locks

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 03:35:19