首页 > 解决方案 > 如何使用 unittest.mock.MagicMock 或 Mock 类模拟“名称”属性?

问题描述

我正在尝试使用模拟名称创建 MagicMock,它似乎不起作用,但适用于其他属性:

from unittest.mock import MagicMock

# Works
assert MagicMock(foo='bar').foo == 'bar'

# Don't work
assert MagicMock(name='bar').name == 'bar'

print(MagicMock(name='bar').name)
<MagicMock name=\'bar.name\' id=\'140031146167376\'>

如何使用 MagicMock 模拟名称属性?

标签: pythonunit-testingmocking

解决方案


name 属性在创建模拟对象期间不能被模拟,因为它具有特殊含义:

name:如果 mock 有名称,那么它将在 mock 的 repr 中使用。这对于调试很有用。该名称被传播到子模拟。

Mock 的 Python 文档

因此,为了模拟名称,应在创建 Mock 或 MagicMock 对象之后并在传递它之前设置它:

mock_obj = MagicMock()
mock_obj.name = 'bar'

assert mock_obj.name == 'bar'

# Passing mock object forward
...

推荐阅读