如何测试异步函数并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
相关产品推荐
相关产品推荐

