- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
对于令人困惑的标题,我深表歉意,我不确定是否有更好的方法来描述问题。我有一个具有以下结构的 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 返回实际实例化的类
我刚刚将代码从单个文件重构为此配置,并且测试在此之前就通过了。对我缺少的东西有什么想法吗?
编辑
我进一步调试,我相信这与继承自 DeviceBaseClass
的 DeviceClass
有关,因此 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/
我在修补自定义类时遇到问题'__init_subclass__ .我认为这与我将修补函数绑定(bind)到类的方式有关: def _patched_initsubclass(cls, **kwargs
我有基于 ARM 的设备,并且板载 Linux。由于某些原因,刷新自定义内核非常困难(uBoot 无法通过 tftp 或其他方式加载内核) 我需要测试我的自定义内核。所以,想法是-替换内存中的内核。您
今天我在远程调试一个客户的问题,我没有构建一个全新的安装并将其发送给他,而是编译了dll,确保版本信息与他安装的版本信息相同,并替换了旧的dll使用我刚刚在他的机器上构建的一个(为了以防万一,备份了另
将简单补丁应用于 Rails 应用程序中的 Ruby gem 的最佳方法是什么? 是否可以保持原始 gem 代码不变? 最佳答案 是的,这是可能的。只需打开类,为有问题的方法取别名,并提供您自己的实现
我正在尝试修补 __new__一个类的方法,它没有按我预期的那样工作。 from contextlib import contextmanager class A: def __init__(
我想将 MediaWiki 从 1.23.1 打补丁到最新的 1.23.4(在 Ubuntu 12.04.5 上)我计划使用补丁:https://www.mediawiki.org/wiki/Manu
假设我修补并模拟了某些实现读取多个文件的函数 foo()。所以我们有多个 open() 调用: def foo(): a=open("stuff.txt") b=open("anoth
我开始使用pathlib,并且在很大程度上非常喜欢使用它。我遇到的问题是由于方法而不是函数的性质而对其进行测试。 def test_correct_dir_was_made(self): wi
我有一个 NSOperation,Authenticate,它通过服务器进行身份验证。 我有另一个操作,类型为 AFJSONRequestOperation 的 fetchImage,它依赖于 Aut
我有简单的 Angular FormBuilder 表单(在 Ionic 2 应用程序中),包含 3 个字段: constructor(public navCtrl: NavController, p
我们在 Glassfish 3.1.2.2 中遇到了一个错误(具体来说,在 Metro 模块中的 WSEndpointImpl 类中),该错误已修复,但有望在 Glassfish 4.0 或 3.1
我有很好的基础测试类,它从 django 测试用例和另一个类扩展而来: class MyTestCase(TestCase, TestFreshProvisionedEachTest): 现在一切正
我有两个 CSV 文件,即 test1.csv 和 test2.csv,由自定义分隔符管道符号 (|) 分隔。我通过 diff 命令获取他们的更改,如下所示 diff test2.csv test1.
我正在用 C 编写程序,并且使用内联汇编。在内联汇编代码中有一些地址,我想在运行时修补它们。 代码的快速示例是这样的: void __declspec(naked) inline(void) {
我有兴趣修补一个文件中由另一种方法调用的方法。示例-original.py 文件包含- def A(): a = 10 b = 5 return a*b; def B(): c
我正在尝试创建一个进程来修补我们当前的 Java 应用程序,以便用户只需要下载差异而不是整个应用程序。我认为我不需要像二进制 diff 那样低级别,因为大多数 jar 文件都很小,所以替换整个 jar
假设我已经将一个 PE 可执行文件加载到内存中并使其适合 dos、nt header 结构,现在我想找出它的 .text/code segement actual(不是 VA)offset+size
我想修补一些使用来自外部模块的对象的代码。 这个对象的一个方法被到处调用,我需要在所有这些调用中设置一个新的默认 kwarg。 与其添加这么多重复的代码,我认为更改对象方法会更好。最干净的方法
我刚刚创建了用户 * 故事表和模型,定义了如下所示的关系 在用户模型中 public function stories() { return $this->hasMany(\A
如果您有虚拟机,则需要在每个补丁星期二应用补丁,并确保操作系统是最新的以防止安全问题。 如果您获得 PAAS Azure WebApp,Microsoft 会负责修补底层操作系统吗? 如果是这样,发生
我是一名优秀的程序员,十分优秀!