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视图时:
@login_required检测到未登录,返回302重定向到登录页- 因为你加了
follow=True,客户端会自动访问重定向后的登录页面 - 登录页的状态码是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
相关产品推荐
相关产品推荐

