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

如何测试Django信号中的异常?附信号与接收器代码示例

测试Django信号中的异常处理

嘿,我来帮你搞定这个信号异常的测试问题~ 从你的代码片段来看,信号接收器里主要要处理的是Link.DoesNotExist异常(毕竟你写了except L...),咱们可以通过构造触发异常的场景,再验证接收器的行为是否符合预期来完成测试。

核心思路

我们需要聚焦两个关键测试点:

  1. 当传入的referral_link存在,但对应的Link数据库记录不存在时,触发Link.DoesNotExist异常
  2. 验证异常被正确捕获后,接收器不会创建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:52:56