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

Django单元测试验证对象已删除,assertRaises捕获DoesNotExist报错如何解决

Django 对象删除功能单元测试正确实现方案

问题根因说明

你遇到的三个报错都属于测试写法的逻辑问题,和实际业务功能无关:

  • assertRaises 只捕获上下文管理器内部抛出的异常,如果你在进入上下文前就执行了查询、refresh_from_db() 操作,异常会提前抛出,无法被捕获,就会出现问题1、3的报错。
  • 校验跳转页面时,对象删除成功后本就不应该再展示已删除的用户名,你断言用户名存在自然会失败,属于断言逻辑写反。

正确测试实现代码

from django.test import TestCase
from django.urls import reverse
from your_app.models import UserComp

class UserCompDeleteTestCase(TestCase):
    def setUp(self):
        # 预创建测试数据
        self.test_user = UserComp.objects.create(username="usr13", 其余字段填对应测试值)
        # 若删除功能需要登录权限,此处补充测试客户端登录逻辑
        # self.client.login(username="管理员账号", password="管理员密码")

    def test_delete_usercomp_normal_flow(self):
        # 发起删除请求,根据你的视图配置调整路由名、传参
        delete_url = reverse("usercomp_delete_view", args=[self.test_user.pk])
        # follow=True 自动跟随重定向到跳转页
        response = self.client.post(delete_url, follow=True)

        # 校验1:验证对象已从数据库删除
        # 方式一:用assertRaises捕获查询异常
        with self.assertRaises(UserComp.DoesNotExist):
            # 注意查询操作必须写在上下文内部
            UserComp.objects.get(pk=self.test_user.pk)
        # 方式二:计数校验更简洁
        self.assertEqual(UserComp.objects.filter(pk=self.test_user.pk).count(), 0)

        # 校验2:验证跳转页内容正确
        # 断言已删除用户名不存在于响应中
        self.assertNotContains(response, self.test_user.username)
        # 可选:校验重定向路径是否符合预期
        self.assertRedirects(response, "/你配置的删除后跳转路径/")

额外注意事项

  • 确保你用POST请求发起删除操作,大部分Django删除视图都会限制仅接受POST请求,用GET请求会触发拦截不执行删除。
  • 若删除操作有权限校验,提前在setUp中完成登录、权限分配操作,避免视图返回403未执行删除逻辑。

内容的提问来源于stack exchange,提问作者Christophe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:24:02