【发布时间】:2017-12-04 14:29:55
【问题描述】:
我尝试用 Python 为 REST 客户端编写一些单元测试。我无法模拟来自服务器的响应。
具体来说,我希望 GET 查询返回一个预先准备好的 JSON 字符串,而不连接到服务器。正如我了解到的那样,在 Python 中执行此操作的方法是使用 unittest.mock 或 pytest-mock。我的项目结构是这样的:
workspace/__init__.py
workspace/module/__init__.py
workspace/module/connector.py
workspace/tests/__init__.py
workspace/tests/test_connector.py
我把测试代码放在test_connector.py。我试过以这种方式使用unittest.mock.patch:
@patch()
test_get_container_list(mocker):
(....)
还有pytest-mock:
mocker.patch('module.connector.Connector.get_container_list.requests.sessions.get')
mocker.return_value.ok = True
mocker.return_value.json.return_value = container_list
我被这个错误难住了:
ImportError: No module named 'module.connector.Connector'; 'module.connector' is not a package
我也尝试修改我在路径中放置的内容,但我得到的只是:
ImportError: No module named 'Connector'
ImportError: No module named 'connector.Connector'; 'connector' is not a package
我用这个命令启动了测试:
pytest 测试/
来自module 目录。我的导入看起来像这样:
import configparser
import pytest
from module.connector import Connector
环境:Ubuntu 16.04、Python 3.5.2、pytest-3.2.5、py-1.5.2、pluggy-0.4.0;插件:mock-1.6.3、cov-2.5.1
所有剩余的测试都没有问题,只有这个带有模拟的测试没有。
我的问题:如何使模拟测试正常工作? (无论我使用pytest-mock 还是unittest.mock,都会出现导入错误)。
【问题讨论】:
-
删除
workspace/__init__.py文件?你需要workspace成为一个包吗? -
__init__.py在那里不需要,但删除它没有帮助。 -
您的问题显然不是 pytest 或 mocking,您在导入解析时遇到了问题。如果我重新创建您描述的设置(
module中的workspacedir、module和tests类Connector包,我可以在测试中导入该类并通过unittest.mock、@987654344 对其进行修补@ 或monkeypatch。所以这显然不是问题。另外,这个:我用这个命令启动了测试:pytest tests/从模块目录不能用你描述的目录结构运行。
标签: python python-3.x mocking pytest