创建充当类对象的MagicMock,并在实例化时创建MagicMock实例

问题描述 投票:0回答:1

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

例如,我有一个验证像这样的字段的拼写模型:

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,但是我无法创建一个模拟的[[class object来充当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()实例。

基本上我需要的是类似的东西:

>>> type(mocked_some_class) <class 'type'> >>> import inspect >>> inspect.getmro(mocked_some_class) (..., <class '__main__.SomeClass'>, ...) >>> mocked_some_class() <MagicMock id='...'>

python python-unittest pydantic
1个回答
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='...'>

希望,对某人有用! :)    
© www.soinside.com 2019 - 2024. All rights reserved.