【发布时间】: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