如何在访问Mock对象属性时抛出异常?测试用例报错求助
解决Mock对象属性抛出异常的问题
我懂你遇到的困扰了——你想让访问model_instance.artist时直接抛出ObjectDoesNotExist异常,但当前测试不仅没触发异常,反而返回了一个MagicMock子对象,导致断言失败。
问题出在哪?
你直接给model_instance.artist赋值了PropertyMock实例,但MagicMock会把这个当成普通的实例属性处理。当你访问model_instance.artist.name时,它先返回这个PropertyMock对象,然后自动为它创建了name子Mock,完全没触发你设置的side_effect。PropertyMock是用来模拟类级别的property属性的,不能直接赋值给实例属性。
正确的测试写法
修改test_artist_name_with_error方法,把PropertyMock附加到model_instance的类上,这样访问实例的artist属性时才会触发异常:
def test_artist_name_with_error(self): model_instance = MagicMock() # 将PropertyMock设置为实例所属类的artist属性 type(model_instance).artist = PropertyMock(side_effect=ObjectDoesNotExist) res = function_to_call_one_to_one(model_instance) self.assertEqual(res, "raised `ObjectDoesNotExist`")
为什么这样就能生效?
当你访问model_instance.artist时,Python会优先查找实例所属类的属性。我们把artist设为类级别的PropertyMock,它的side_effect会在属性被访问时立刻触发,直接抛出ObjectDoesNotExist异常,这样就会进入函数的except块,返回你预期的字符串,测试就能顺利通过了。
这种写法也更贴合真实场景——Django的一对一关联属性本质就是类级别的property。
内容的提问来源于stack exchange,提问作者JPG
相关产品推荐
相关产品推荐

