unittest mock和多继承:TypeError:元类冲突

时间:2018-06-06 09:32:58

标签: python-3.x unit-testing mocking

我有一个具有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开头的行进行评论,则表示所有行都符合预期。

有没有办法模拟模块或类,以便多重继承继续工作?

2 个答案:

答案 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