【问题标题】:Mock class attribute with side_efffect带有 side_effect 的模拟类属性
【发布时间】:2020-10-19 14:07:51
【问题描述】:

如何在访问模拟对象的属性时引发异常?

我已经尝试对下面的 sn-p 做同样的事情,

import unittest
from unittest import TestCase
from django.core.exceptions import ObjectDoesNotExist
from unittest.mock import MagicMock, PropertyMock


def function_to_call_one_to_one(model_instance):
    try:
        return model_instance.artist.name
    except ObjectDoesNotExist:
        # calling `model_instance.artist` will raise `ObjectDoesNotExist` exception
        return "raised `ObjectDoesNotExist`"


class TestObjectDoesNotExist(TestCase):
    def test_artist_name(self):
        model_instance = MagicMock()
        model_instance.artist.name = "Michael Jackson"
        name = function_to_call_one_to_one(model_instance)
        self.assertEqual(name, "Michael Jackson")

    def test_artist_name_with_error(self):
        model_instance = MagicMock()
        model_instance.artist = PropertyMock(side_effect=ObjectDoesNotExist)
        res = function_to_call_one_to_one(model_instance)
        self.assertEqual(res, "raised `ObjectDoesNotExist`")


if __name__ == '__main__':
    unittest.main()

很遗憾,测试功能test_artist_name_with_error(...) 失败并显示消息,

AssertionError: != 'raised ObjectDoesNotExist'

我该如何为这个案例编写单元测试?

注意:我看过这个 SO 帖子 Python: Mock side_effect on object attribute,但是它对我不起作用。我希望,这个例子是一个可重现的

【问题讨论】:

    标签: python django unit-testing python-mock


    【解决方案1】:

    很好的问题。这是您可能忽略的docs 的一部分:

    由于模拟属性的存储方式,您不能直接将PropertyMock 附加到模拟对象。相反,您可以将其附加到模拟类型对象。

    这行得通:

    type(model_instance).artist = PropertyMock(side_effect=ObjectDoesNotExist)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-08
      • 2023-03-30
      • 1970-01-01
      • 2016-09-15
      • 2021-07-15
      • 2020-10-16
      • 2018-09-21
      相关资源
      最近更新 更多