如何测试Django信号中的异常?附信号与接收器代码示例
测试Django信号中的异常处理
嘿,我来帮你搞定这个信号异常的测试问题~ 从你的代码片段来看,信号接收器里主要要处理的是Link.DoesNotExist异常(毕竟你写了except L...),咱们可以通过构造触发异常的场景,再验证接收器的行为是否符合预期来完成测试。
核心思路
我们需要聚焦两个关键测试点:
- 当传入的
referral_link存在,但对应的Link数据库记录不存在时,触发Link.DoesNotExist异常 - 验证异常被正确捕获后,接收器不会创建
FlatReferral记录,也不会向上抛出异常影响主流程
具体测试代码示例
首先导入必要的测试工具和项目模块:
from django.test import TestCase from django.contrib.auth.models import User from your_app.models import Link, FlatReferral from your_app.signals import create_flat_referral # 替换成信号所在的实际路径 from unittest.mock import MagicMock, patch
然后编写测试类:
class FlatReferralSignalExceptionTest(TestCase): def setUp(self): # 提前创建测试用的被推荐用户,但不创建对应的Link记录 self.referred_user = User.objects.create_user( username="test_referred", password="test_pass123" ) def test_invalid_referral_link_handled_properly(self): # 构造模拟request,带一个不存在的referral token mock_request = MagicMock() # 模拟POST里没有referral参数,从GET取到无效token mock_request.POST.get.return_value = None mock_request.GET.get.return_value = "non_existent_token" # 发送信号 create_flat_referral.send( sender=None, request=mock_request, user=self.referred_user ) # 验证:没有创建FlatReferral记录,说明异常被正确处理 self.assertEqual(FlatReferral.objects.count(), 0) @patch("your_app.signals.FlatReferral.objects.create") def test_exception_triggers_no_create(self, mock_create): # 用mock监控FlatReferral的create方法,确认它没被调用 mock_request = MagicMock() mock_request.GET.get.return_value = "non_existent_token" create_flat_referral.send( sender=None, request=mock_request, user=self.referred_user ) # 确认create方法从未执行,说明代码进入了except分支 mock_create.assert_not_called()
额外进阶:验证异常日志(如果有)
如果你在except块里添加了日志记录(比如logger.error("无效的推荐链接")),还可以测试日志是否正常输出:
import logging from unittest.mock import patch def test_exception_logged_correctly(self): mock_request = MagicMock() mock_request.GET.get.return_value = "non_existent_token" # 捕获日志输出 with patch("your_app.signals.logger.error") as mock_log: create_flat_referral.send( sender=None, request=mock_request, user=self.referred_user ) # 验证日志被调用了一次 mock_log.assert_called_once()
关键说明
MagicMock用来模拟request对象,不需要真实的HTTP请求,只需要让它返回我们需要的测试数据即可。setUp方法里只创建用户,不创建对应Link,这样用无效token查询时必然触发Link.DoesNotExist异常。- 用
patch可以精准监控内部方法的调用情况,确认异常分支是否被执行。
内容的提问来源于stack exchange,提问作者Narnik Gamarnik
相关产品推荐
相关产品推荐

