在 Python 中模拟数据 类 时如何使用规范

How to use spec when mocking data classes in Python

我正在尝试使用 backport 包将我们的 namedtuple 类 移植到 Python 3.6 中的数据类中。但是,我注意到在模拟数据类 类 时,您不能再使用 "spec" 关键字。我假设这是因为数据类代码是自动生成的。

from dataclasses import dataclass
import mock

@dataclass
class A:
    aaa: str
    bbb: int


m = mock.Mock(spec=A)

m.aaa

这是我得到的错误:

AttributeError: Mock object has no attribute 'aaa'

知道是否有任何方法可以自动将原始对象的所有属性设置为模拟对象?我有很多数据 类 有很多数据。如果我尝试一个一个地手动设置值,那将是非常乏味的。

我最终使用这个通用辅助函数来实现规范对常规 类 的作用:

import mock
from dataclasses import fields


def create_dataclass_mock(obj):
    return mock.Mock(spec=[field.name for field in fields(obj)])

您还可以将具有虚拟值的实例传递给 spec

from unittest.mock import Mock
from dataclasses import dataclass

@dataclass
class A:
    aaa: str
    bbb: int

m = Mock(spec=A(None, None))

print(m.bbb)
# <Mock name='mock.bbb' id='139766470904856'>