python - 如何在pytest中模拟类的模块导入
问题描述
我正在尝试测试一个从其他模块导入函数的类。我想模拟那个函数调用。我不知道怎么做。
please_configure.py
from src.messages.create import create_please
class PleaseConfigure():
def __init__():
self._call = { "create_please": create_please }
def handle_call(msg):
self._call[msg["method"]](msg["args"])
创建.py
def create_please(args):
# does something not so important
test_please_configure.py
from src.consumers.please_configure import PleaseConfigure
@patch.object(PleaseConfigure, "_call")
def test_please_configure_success(mocked_call):
cf = PleaseConfigure()
# want to test cf.handle_call()
我已将上述类简化到它们显然不再做太多事情的程度,但这是 3 个文件之间的正确导入层次结构。在 PleaseConfigure 的实例中,我应该如何模拟 _call 字典中的函数?
在 test_please_configure_success 我尝试了以下变体:
@patch.object(PleaseConfigure, "_call")
@patch.object(PleaseConfigure, "create_please")
@patch.object(PleaseConfigure, "src.messages.create")
@patch.object(PleaseConfigure, "src.messages.create.create")
我也尝试过使用上下文管理器做类似的事情。它似乎不起作用,并且变得非常令人沮丧。感谢任何模拟此功能的帮助,以便我可以测试 PleaseConfigure 类。
解决方案
所以以下工作。
@patch('src.consumers.please_configure.create_please')
def test_handle_message(mocked_create):
cf = PleaseConfigure()
cf 实例有 dict _call { "create_please": create_please } ,它现在是 MagicMock 的一个实例,并且有一个引用 mocked_create 作为参数传入。
推荐阅读
- laravel - 通过 Laravel API 验证 PDF 流
- javascript - JavaScript 复制到剪贴板只工作一次
- mysql - .sql 文件到 mariadb 的批处理文件导入失败
- android - 自定义浮动操作按钮
- php - php localhost邮件没有收到
- java - 在 Java 中为以前的操作系统版本解析 DateTime
- c# - 使用 OleDbConnection、OleDbCommand 从 Excel 中读取 10000 多行
- python-3.x - 使用字典理解
- jpa - 如何从客户端访问 javax/persistence/?
- php - 当用户登录时显示“注销”按钮,当他不使用 PHP/MySQL 时显示“连接”