unittest.mock: 在指定的模拟对象上设置自定义属性(变量)
unittest.mock: Set custom attribute (variable) on specced mock object
我正在尝试 mock
来自另一个库的 class 的现有对象,用于 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
我想出的最好办法是在设置 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%]
我正在尝试 mock
来自另一个库的 class 的现有对象,用于 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
我想出的最好办法是在设置 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%]