unittest.mock: 在指定的模拟对象上设置自定义属性(变量)

unittest.mock: Set custom attribute (variable) on specced mock object

我正在尝试 mock 来自另一个库的 class 的现有对象,用于 pytest 的单元测试。 但是,其他库中的属性(不是方法)大多是在运行时设置的。

我想达到的目标

from unittest.mock import Mock
from otherlib import ClassName

def test_stuff():
    mock_object = Mock(spec=ClassName)
    mock_object.data.outward.key = 12345

    assert mock_object.data.outward.key == 12345  # AttributeError: Mock object has no attribute 'data'

我在代码更改中进行了这些尝试,但没有成功

...
def test_stuff():
    mock_object = Mock(spec=ClassName, **{'data.outward.key': 12345})

    assert mock_object.data.outward.key == 12345
...
def test_stuff():
    mock_object = Mock(spec=ClassName)
    attrs = {'data.outward.key': 12345}
    mock_object.configure_mock(**attrs)

    assert mock_object.data.outward.key == 12345

我想出的最好办法是在设置 main mock object's 属性时使用另一个 Mock object。它有效,但我想对此有更好的解决方案...?

from unittest.mock import Mock
from otherlib import ClassName

def test_stuff():
    mock_data = Mock(spec=["outward"], key=12345)
    mock_object = Mock(spec=ClassName, data=mock_data)
    mock_object.data.outward.key = 12345

    assert mock_object.data.outward.key == 12345  # tests.py::test_stuff PASSED [100%]