我有一个具有pip
可安装依赖项的包。为了能够构建文档,我试图使用MagicMock
来模拟不可安装的包。
但是我遇到了多重继承的问题:当其中一个父类是一个模拟类时,我得到:
TypeError:元类冲突:派生类的元类必须是元类的(非严格)子类
以下示例说明了此问题:
file:class_a.py
class A:
pass
file:code.py
from class_a import A
class B:
pass
class C(A, B):
pass
file: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
开头的行进行评论,则表示所有行都符合预期。
有没有办法模拟模块或类,以便多重继承继续工作?
答案 0 :(得分:2)
我做了一些更多的研究和测试,并且找到了一种方法,因此我为完整性回答了我自己的问题。我不知道这是解决方案还是解决方法。但是,诀窍是明确模拟涉及多重继承的类。以下确实可以正常工作:
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通,然后我将重新评估接受的答案。
答案 1 :(得分:0)
我知道这是老帖子,但无论如何。 看起来这些行不是必需的,因为模块class_a存在,您不需要模拟它:
Angular