1

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

我想要达到的目标

  • 获得模拟对象的所有好处spec
  • 设置我的单元测试所需的(嵌套)属性(不是方法)以模拟它们,就像它们是在对象创建期间设置的一样
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
4

1 回答 1

-1

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

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%]
于 2020-05-14T09:06:29.403 回答