如何测试Django视图函数在RedirectUrl不存在时返回HTTP404
Django 视图函数测试实现方案
基于Django原生的TestCase类即可完成你需要的所有逻辑测试,无需引入额外第三方库。
前置修正说明
你现有代码存在2处需要先对齐的问题,避免测试无法通过:
- 视图
clickActivity中使用的redirect_url.test_check_url字段,在模型定义中实际命名为symptom_check_url,需要修正字段名保持一致,否则会触发属性不存在的报错。 - 你描述的业务场景中
whatsappid是查询参数(?whatsappid=xxx),但当前路由和视图是将whatsappid作为路径参数接收,若需要兼容查询参数的传参方式,可调整视图从request.GET.get('whatsappid')取值,同步修改路由配置去掉路径中的<int:whatsappid>段。
测试代码示例
在你的应用下新建tests.py文件,写入以下代码:
from django.test import TestCase from django.urls import reverse from .models import RedirectUrl, RedirectUrlsEntry class ClickActivityTest(TestCase): def setUp(self): # 提前创建测试用的RedirectUrl实例 self.test_redirect_url = RedirectUrl.objects.create( symptom_check_url="https://test_check.co.za" ) self.valid_pk = self.test_redirect_url.pk self.invalid_pk = 9999 # 不存在的主键 self.test_whatsappid = 12345 def test_redirect_url_not_exist_return_404(self): # 测试不存在的RedirectUrl返回404 url = reverse('ada_hook_redirect', args=[self.invalid_pk, self.test_whatsappid]) response = self.client.get(url) self.assertEqual(response.status_code, 404) def test_redirect_url_exist_redirect_correctly(self): # 测试跳转逻辑正确 url = reverse('ada_hook_redirect', args=[self.valid_pk, self.test_whatsappid]) response = self.client.get(url) # 断言状态码是302重定向 self.assertEqual(response.status_code, 302) # 断言跳转目标URL正确 expected_url = f"https://test_check.co.za/?whatsappid={self.test_whatsappid}" self.assertRedirects(response, expected_url, fetch_redirect_response=False) def test_access_log_saved_correctly(self): # 测试访问记录存储正确 # 请求前统计记录数 initial_count = RedirectUrlsEntry.objects.filter(url=self.test_redirect_url).count() url = reverse('ada_hook_redirect', args=[self.valid_pk, self.test_whatsappid]) self.client.get(url) # 请求后统计记录数 new_count = RedirectUrlsEntry.objects.filter(url=self.test_redirect_url).count() # 断言新增1条记录 self.assertEqual(new_count, initial_count + 1) # 断言新增记录关联的RedirectUrl正确 latest_entry = RedirectUrlsEntry.objects.latest('time_stamp') self.assertEqual(latest_entry.url, self.test_redirect_url)
运行测试
在项目根目录执行命令python manage.py test 你的应用名即可运行上述测试用例。
内容的提问来源于stack exchange,提问作者user2875230
相关产品推荐
相关产品推荐

