【问题标题】:How to use spec when mocking data classes in Python在 Python 中模拟数据类时如何使用规范
【发布时间】:2019-01-09 10:49:43
【问题描述】:

我正在尝试使用 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'

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

【问题讨论】:

  • 如果它是一个普通类,它会在尝试访问 m.aaa 时返回如下内容:
  • 哦,您正在尝试访问实例变量。就我而言,我使用的是类变量,类似于定义的 namedtuple 和 dataclasse 类。
  • 无论有没有dataclass,类变量的工作方式也应该几乎相同。您只是在这里没有任何类变量。 (aaa: str是注解,不是类变量,数据类处理不会创建aaa类变量。)
  • 感谢您的澄清。

标签: python attributes mocking python-dataclasses


【解决方案1】:

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

import mock
from dataclasses import fields


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

【讨论】:

【解决方案2】:

您还可以将具有虚拟值的实例传递给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'>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多