创建行为类似于类对象的MagicMock,并在实例化时创建MagicMock实例

时间:2020-06-13 15:58:14

标签: python python-unittest pydantic

我有一个很有趣的问题。我正在尝试模拟一个将通过内部验证并且在实例化时将返回magicmock实例的类。

例如,我有一个pydantic模型来验证诸如以下字段:

from typing import Type
from pydantic import BaseModel

class SomeClass:
    pass

class SubSomeClass(SomeClass):
    pass

class OtherClass:
    pass

class SomeModel(BaseModel):
    cls: Type[SomeClass]

# here I can put either `SomeClass` or its subclasses
validated_some = SomeModel(cls=SubSomeClass)

# this would cause ValidationError
SomeModel(cls=OtherClass)
"""
pydantic.error_wrappers.ValidationError: 1 validation error for SomeModel
cls
  subclass of SomeClass expected (type=type_error.subclass; expected_class=SomeClass)
"""

现在,在我的测试中,我正在尝试使用SomeClass模拟MagicMock,但是无法创建模拟的{em> class对象,该对象的作用类似于{{ 1}}。

我尝试了以下操作:

SomeClass
>>> type(Mock(spec=SomeClass))
<class 'unittest.mock.Mock'> # doesn't pass validation

实例化即class MockSomeClass(SomeClass, MagicMock): """Mocked SomeClass""" def __init__(self, *args, **kwargs): pass 时不返回MagicMock实例。

基本上,我需要的是这样的东西:

MockSomeClass()

1 个答案:

答案 0 :(得分:0)

这就是我最终要做的:

class MockSomeClass(SomeClass, Mock):
    """Mocked SomeClass class"""

    def __new__(cls, *args, **kwargs):
        return MagicMock()

现在所有检查都通过了:

>>> type(MockSomeClass)
<class 'type'>

>>> inspect.getmro(MockSomeClass)
(<class '__main__.MockSomeClass'>, <class '__main__.SomeClass'>, <class 'unittest.mock.Mock'>, ...)

>>> MockSomeClass()
<MagicMock id='...'>

希望,它将对某人有用! :)