首页 > 解决方案 > 如何在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 类。

标签: pythonmockingpytest

解决方案


所以以下工作。

@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 作为参数传入。


推荐阅读