Django UpdateView form_valid未按预期重定向,测试异常求助
问题分析与解决方案
1. 测试用例的核心错误
你的测试失败直接源于两处明显的断言错误:
(1) 消息断言完全颠倒
测试场景是未完成的tressle,视图本应返回错误提示消息,但你的测试代码却断言了成功完成的消息:
# 错误的断言 self.assertEqual( messages[0].message, "The tressle has been finalized and is no longer editable." )
正确的断言应该匹配视图中定义的错误提示,同时建议和视图保持一致使用国际化函数:
from django.utils.translation import gettext as _ # 修正后的断言 self.assertEqual( messages[0].message, _("The tressle is not complete. Please ensure that all requirements have been met.") )
(2) 重定向目标ID错误
重定向的kwargs中你使用了self.tressle_person.id,但实际应该指向测试用的未完成tressle的ID:
self.assertRedirects( response, reverse_lazy( "myapp:tressle-detail", kwargs={ "tressle_id": self.incomplete_tressle.id, # 替换self.tressle_person.id }, ), )
2. 关于“执行了super().form_valid”的误解
你提到调试时看到触发错误重定向后还执行了后续代码,这大概率是误判:
- 当
form.instance.progress() < 100条件满足时,return redirect(...)会直接终止form_valid方法的执行,后续的代码(包括super().form_valid(form))不可能被执行 - 如果调试器中出现后续代码的执行记录,可能是测试用例中
follow=True导致客户端自动跟进了重定向请求,或是断点设置的误触发
3. 额外验证建议
如果修正测试用例后仍有问题,建议补充以下验证步骤:
- 提前断言测试用的tressle确实处于未完成状态:
self.assertLess(self.incomplete_tressle.progress(), 100) - 检查
TressleForm的逻辑,确认它不会在验证过程中修改form.instance的状态,导致progress()值发生变化 - 确认测试登录用户
self.app_user关联了有效的Person对象,避免get_object_or_404抛出异常(视图设置了raise_exception=True,若有异常测试会直接报错)
内容的提问来源于stack exchange,提问作者UpDawg
相关产品推荐
相关产品推荐

