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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:51:03