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

Django TestCase异常:空patient参数返回200而非预期404

问题分析与解决方案

你的测试返回200而不是预期的404,核心原因是测试中的客户端未处于登录状态,被@login_required装饰器重定向到了登录页面,而follow=True让客户端跟随重定向,最终返回了登录页的200状态码,掩盖了原本应该出现的404错误。

为什么会这样?

Django的TestCase每个测试方法都会独立执行setUp,也就是说test_pdf_page里的self.client是全新的,并没有继承test_index_page里的登录状态。当你调用需要登录的pdf视图时:

  1. @login_required检测到未登录,返回302重定向到登录页
  2. 因为你加了follow=True,客户端会自动访问重定向后的登录页面
  3. 登录页的状态码是200,所以你的测试断言就得到了200,而不是预期的404

解决方法

在test_pdf_page方法里先完成登录,或者在setUp中统一登录客户端,确保请求是来自已登录用户的。

修改后的测试代码示例:

def test_pdf_page(self):
    # 先登录客户端
    self.client.post('/registration/login/', {'username': 'Slater', 'password': 'mereva2019'}, follow=True)
    
    # cas référence : informations passées en get (patient, medicament et type) sont valides
    url = '/randomization/pdf/'
    response = self.client.get(url,{'patient': self.patient.ran_num, 'medicament': str(self.medicament.med_ide),'type' : 1},follow=True)
    self.assertEquals(response.status_code,200)
    
    # patient = ''
    url = '/randomization/pdf/'
    response = self.client.get(url,{'patient': '', 'medicament': str(self.medicament.med_ide),'type' : 1},follow=True)
    self.assertEquals(response.status_code,404)

或者更优雅的方式,把登录逻辑放到setUp里,让所有测试方法都使用已登录的客户端:

def setUp(self):
    self.client = Client(HTTP_ACCEPT_LANGUAGE='en')
    # ... 其他对象创建代码 ...
    # 登录客户端
    self.client.post('/registration/login/', {'username': 'Slater', 'password': 'mereva2019'}, follow=True)

额外验证点

另外,你可以检查下Medicament的med_ide字段:因为你没有手动指定它的值,Django会自动生成自增整数,str(self.medicament.med_ide)的写法是正确的,Django的查询会自动将字符串转换为整数类型匹配,这部分不会导致问题。

当客户端登录后,再传入空patient参数,get_object_or_404(Randomisation, ran_num='')会因为找不到对应对象而抛出Http404,测试就能正确断言404状态码了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 21:23:14