如何使用 PropertyMock 模拟嵌套属性

How to mock nested properties with PropertyMock

我正在尝试从库函数 mlflow.get_run(run_id).data.metrics 的 return 值模拟 属性 的 属性。我知道如何像这样模拟单层:

m = mock.MagicMock(spec_set=mlflow.get_run)
type(m).metrics = mock.PropertyMock(side_effect=[1, 2])
print(m.metrics)
print(m.metrics)

###output
1
2

如果我模拟嵌套的 属性 虽然我得到错误“MagicMock 没有属性 'data'”

type(m).data.metrics = mock.PropertyMock(side_effect=[1, 2])

模拟嵌套属性的正确方法是什么?

您需要基本上重复您对 mdata 所做的操作。将 data 属性 的 return_value 设置为另一个 MagickMock 然后将其类型设置为 PropertyMock.

from unittest import mock

m = mock.MagicMock(spec_set=mlflow.get_run)
type(m).data = mock.PropertyMock(return_value=mock.MagicMock())
type(type(m).data).metrics = mock.PropertyMock(side_effect=[1, 2])

print(m.data.metrics)
# 1
print(m.data.metrics)
# 2