如何测试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
相关产品推荐
相关产品推荐

