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

如何测试Django应用的delete视图,解决NoneType类型报错问题

错误原因

你的删除视图逻辑是从request.GET(也就是URL的查询参数)中读取要删除的资源id,但是你编写的测试代码把id放在了DELETE请求的请求体中传输,服务端无法从查询参数中获取到对应id值,request.GET.get('id')返回None,调用int()转换时就触发了类型报错。

修复方案

方案1:直接修改测试代码适配现有视图

直接把id作为查询参数传递即可,修改后的测试用例如下:

class TestURL(TestCase):
    def setUp(self):
        self.client = Client()
    def test_animal_delete(self):
        animal = Animal.objects.create(name = 'TestAnimal')
        # 将id放在查询参数中传输,适配现有视图的取值逻辑
        response = self.client.delete(reverse("category_animal"), {'id': animal.id})
        self.assertEqual(status.HTTP_204_NO_CONTENT,response.status_code )

方案2(推荐):调整视图取值逻辑+配套修改测试代码

当前把操作资源的id放在查询参数的写法不符合REST接口设计规范,建议调整为从请求体或者URL路径中取id,同时优化掉原代码里的裸异常捕获逻辑。

调整视图从请求体取id的代码:

class AnimalView(APIView):
    def delete(self, request, format = None):              
        id = int(request.data.get('id'))
        try:
            animal = Animal.objects.get(id=id)
        except Animal.DoesNotExist:
            return Response(status=status.HTTP_404_NOT_FOUND)
        animal.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

对应调整后的测试代码:

class TestURL(TestCase):
    def setUp(self):
        self.client = Client()
    def test_animal_delete(self):
        animal = Animal.objects.create(name = 'TestAnimal')
        # 传json请求体时需要指定content_type
        response = self.client.delete(reverse("category_animal"), json.dumps({'id' : animal.id}), content_type="application/json")
        self.assertEqual(status.HTTP_204_NO_CONTENT,response.status_code )

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:45:01