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
相关产品推荐
相关产品推荐

