我有一个具有不可pip
安装依赖项的软件包。为了能够建立文档,我尝试使用来模拟不可安装的程序包MagicMock
。
但是我偶然发现了多重继承的问题:当父类之一是模拟类时,我得到:
TypeError:元类冲突:派生类的元类必须是元类的(非严格)子类
以下示例说明了该问题:
文件:class_a.py
class A:
pass
文件:code.py
from class_a import A
class B:
pass
class C(A, B):
pass
文件:test.py
import sys
from unittest import mock
# inspired by https://stackoverflow.com/a/37363830/1860757
MOCK_MODULES = ['class_a', ]
sys.modules.update((mod_name, mock.MagicMock()) for mod_name in MOCK_MODULES)
import code
code.C()
如果我跑步,python3 test.py
我会得到上述异常。如果我注释以开头的行sys.modules.update
,则所有行为均与预期的一样。
有没有一种方法可以模拟模块或类以使多重继承继续起作用?
我做了一些更多的研究和测试,并且找到了一种方法,因此我回答自己的问题以求完整性。我不知道这是解决方案还是解决方法。但是,诀窍是显式地模拟涉及多重继承的类。以下功能确实可以正常工作:
import sys
from unittest import mock
class _A:
pass
MOCK_MODULES = ['class_a', ]
sys.modules.update((mod_name, mock.MagicMock()) for mod_name in MOCK_MODULES)
patcher = mock.patch('class_a.A', new=_A)
patcher.start()
import code
code.C()
patcher.stop()
如果以后有人找到新的/更好的方式,请ping通我,我将重新评估接受的答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句