unittest模拟和多重继承:TypeError:元类冲突

弗朗切斯科·蒙特萨诺(Francesco Montesano)

我有一个具有不可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,则所有行为均与预期的一样。

有没有一种方法可以模拟模块或类以使多重继承继续起作用?

弗朗切斯科·蒙特萨诺(Francesco Montesano)

我做了一些更多的研究和测试,并且找到了一种方法,因此我回答自己的问题以求完整性。我不知道这是解决方案还是解决方法。但是,诀窍是显式地模拟涉及多重继承的类。以下功能确实可以正常工作:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章