如何使用 unittest.mock.MagicMock 或 Mock 类模拟 `name` 属性?

And*_*yko 5 python unit-testing mocking

我正在尝试使用模拟名称创建 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\'>

Run Code Online (Sandbox Code Playgroud)

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

And*_*yko 7

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

名称:如果模拟有一个名称,那么它将在模拟的代表中使用。这对于调试很有用。该名称传播到子模拟。

Mock 的 Python 文档

因此,为了模拟名称,应在创建 MagicMock 之后并在将其传递之前进行设置:

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

assert mock_obj.name == 'bar'

# Passing mock object forward
...
Run Code Online (Sandbox Code Playgroud)


nat*_*a_m 7

自从提出这个问题以来已经有一段时间了,但是模拟的文档现在明确提到了这种情况并提出了两种解决方案。其中之一是name在模拟创建后设置属性,如另一个答案所示;另一种可能的解决方案是使用configure_mock()

>>> mock = MagicMock()
>>> mock.configure_mock(name='my_name')
>>> mock.name
'my_name'
Run Code Online (Sandbox Code Playgroud)