gpt4 book ai didi

python - 修补从模拟类调用的类函数

转载 作者:太空宇宙 更新时间:2023-11-03 20:57:18 25 4
gpt4 key购买 nike

对于令人困惑的标题,我深表歉意,我不确定是否有更好的方法来描述问题。我有一个具有以下结构的 python 库:

library/
src/
code/
__init__.py
baseclass.py
helpers.py
class1.py
tests/
__init__.py
test_library.py

我正在尝试测试 baseclass.py 中的类中的函数。 baseclass.py 中的类中的函数从 class1.py 返回类对象,如下所示:基类.py:

from class1 import DeviceClass

class LibraryBuilder:
def __init__(self, user, password):
......

def get_devices(self):
devlist = helpers.call_api('api_url', 'post', header, json)
#Return a list of dictionaries
for dev in devlist:
if dev = "DeviceType":
return DeviceClass(dev, self)

test_library.py

import pytest
from unittest.mock import patch, Mock
from library.baseclass import LibraryBuilder
import library
from library.class1 import DeviceClass

class TestDeviceList(object):
@pytest.fixture()
def api_mock(self, caplog):
self.mock_api_call = patch('library.helpers.call_api', autospec=True)
self.mock_api = self.mock_api_call.start()
self.mock_api.return_value.ok = True
self.library_obj = library.baseclass.LibraryBuilder('sam@mail.com', 'pass')
yield
self.mock_api_call.stop()

@patch.object('baseclass.class1', 'DeviceClass', autospec=True)
def test_get_devices_all(self, caplog, dev_mock, api_mock):
self.mock_api.return_value = return_dict
devs = self.library_object.get_devices()
dev_mock.assert_called_with(return_dict, self.library_object)

测试失败,因为从未调用“device_object”。当我调试时,我发现创建的 device_patch 对象不是模拟对象,而是实际的 DeviceClass 对象。

我尝试将 device_object 路径引用到 patch.object('library.baseclass', 'DeviceClass', autospec=True)。我尝试了导入类的变体,因为我相信这与下面的线程有关,但我不知道哪里出了问题: Why python mock patch doesn't work?

call_api 模拟可以正常工作。 library_object 根据 call_api 模拟的 return_value 返回实际实例化的类

我刚刚将代码从单个文件重构为此配置,并且测试在此之前就通过了。对我缺少的东西有什么想法吗?

编辑

我进一步调试,我相信这与继承自 DeviceBaseClassDeviceClass 有关,因此 device_class.py 如下所示:

class DeviceBaseClass(object):
def __init__(self, details, manager):
self.details = {}
..............
class DeviceClass(DeviceBaseClass):
def __init__(self, details, manager):
super(DeviceClass, self).__init__(details, manager)

所以现在我收到消息TypeError: super() argument 1 must be type not MagicMock。我猜测,因为我正在模拟 DeviceClass,所以模拟的类正在 super() 方法中被调用。我看过其他一些关于此问题的帖子,但尚未找到解决方案。我是否遗漏了一些明显的东西,或者我是否走在完全错误的轨道上?

最佳答案

终于弄清楚了,因为我认为这是导入模块的位置。我尝试了所有可能的变体,解决方案是确保您从调用它的位置修补对象。我不知道为什么我昨晚没有看到这个!!

原始调用补丁是 @patch('baseclass.class1', 'DeviceClass', autospec=True) 正确的补丁是 @patch('baseclass.DeviceClass', autospec=正确)如下所示

import pytest
from unittest.mock import patch, Mock
from library.baseclass import LibraryBuilder
import library
from library.class1 import DeviceClass

class TestDeviceList(object):
@pytest.fixture()
def api_mock(self, caplog):
self.mock_api_call = patch('library.helpers.call_api', autospec=True)
self.mock_api = self.mock_api_call.start()
self.mock_api.return_value.ok = True
self.library_obj = library.baseclass.LibraryBuilder('sam@mail.com', 'pass')
yield
self.mock_api_call.stop()

@patch('Library.baseclass.DeviceClass', autospec=True)
def test_get_devices_all(self, caplog, dev_mock, api_mock):
self.mock_api.return_value = return_dict
devs = self.library_object.get_devices()
dev_mock.assert_called_with(return_dict, self.library_object)

关于python - 修补从模拟类调用的类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55931378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com