Django Rest Framework测试返回404问题求助(已自行解决)
解决Django DRF测试中404 Not Found的问题
你碰到的这个404问题其实很典型——Django的测试框架会创建一个完全独立的测试数据库,和你本地开发用的主数据库是完全隔离的。你主数据库里ID为1的Case对象,在测试环境里根本不存在,所以请求自然返回404。
直接解决方案:在测试中创建测试数据
你需要在测试用例里手动创建需要的Case对象(包括关联的Image),或者在测试的初始化阶段填充测试数据。这里给你修正后的测试用例:
from django.contrib.auth.models import User from rest_framework.test import APITestCase from rest_framework import status from rest_framework.reverse import reverse from your_app.models import Case, Image # 替换成你的实际模型路径 class CaseTests(APITestCase): def setUp(self): # 1. 创建测试用户 self.test_user = User.objects.create_user(username='jim', password='monkey123', email='jim@jim.com') # 2. 创建关联的Image对象 self.test_image = Image.objects.create( file='media/images/trampe.jpg', description='A lovely picture of Trampe' ) # 3. 创建测试用的Case对象(ID会自动生成1,和你主库一致) self.test_case = Case.objects.create( total_points=5000, passing_points=3700, budget=5000, description='Saving Trampe from Trauma', name='Trampe', signalment='8yr, intact male, mixed breed.', problem='Respiratory difficulty', image=self.test_image ) def test_status_code(self): """Ensure that case/1 returns 200 OK""" # 登录测试用户 self.client.force_authenticate(user=self.test_user) # 生成测试URL url = reverse('case', kwargs={'pk': self.test_case.pk}) # 发送GET请求 response = self.client.get(url) # 断言状态码 self.assertEqual(response.status_code, status.HTTP_200_OK) # 可选:断言返回的数据和创建的测试数据一致 self.assertEqual(response.data['name'], self.test_case.name)
为什么这样改?
setUp方法:Django测试会在每个测试方法执行前自动运行setUp,在这里创建测试数据可以保证每个测试都有干净、独立的环境。- 用
APITestCase的client:比起直接用APIRequestFactory和手动调用视图,client更贴近真实的HTTP请求场景,写法也更简洁。 - 避免硬编码ID:用
self.test_case.pk代替硬编码的1,即使测试数据的ID变化也不会影响测试结果。
额外建议:批量导入测试数据
如果你有大量测试数据需要复用,可以:
- 用Django的
fixtures功能,把测试数据导出为JSON/YAML文件,在测试中加载 - 写一个数据导入脚本,在
setUpTestData(整个测试类只执行一次)里调用
内容的提问来源于stack exchange,提问作者anowlinorbit
相关产品推荐
相关产品推荐

