【问题标题】:unittest.mock: Set custom attribute (variable) on specced mock objectunittest.mock:在指定的模拟对象上设置自定义属性(变量)
【发布时间】:2020-05-13 15:01:33
【问题描述】:

我正在尝试 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

【问题讨论】:

    标签: python unit-testing mocking python-unittest python-unittest.mock


    【解决方案1】:

    我想出的最好的方法是在设置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%]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      相关资源
      最近更新 更多