You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在访问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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 15:47:51