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 模拟名称属性?
name 属性在创建期间不能被模拟,因为它具有特殊含义:
名称:如果模拟有一个名称,那么它将在模拟的代表中使用。这对于调试很有用。该名称传播到子模拟。
因此,为了模拟名称,应在创建 MagicMock 之后并在将其传递之前进行设置:
mock_obj = MagicMock()
mock_obj.name == 'bar'
assert mock_obj.name == 'bar'
# Passing mock object forward
...
Run Code Online (Sandbox Code Playgroud)
自从提出这个问题以来已经有一段时间了,但是模拟的文档现在明确提到了这种情况并提出了两种解决方案。其中之一是name在模拟创建后设置属性,如另一个答案所示;另一种可能的解决方案是使用configure_mock():
>>> mock = MagicMock()
>>> mock.configure_mock(name='my_name')
>>> mock.name
'my_name'
Run Code Online (Sandbox Code Playgroud)