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

如何在Django测试中模拟django_apps.get_model()的LookupError

如何在Django测试中模拟django_apps.get_model()抛出LookupError?

你需要测试的序列化器代码片段:

try:
    app_config = django_apps.get_app_config(BcConfig.name)
    app_model = django_apps.get_model(app_label=app_config.name,
                                      model_name=type_model_name)
    recording = app_model.objects.create(**recording)
except LookupError:
    recording = None

直接修改应用注册或数据库模型的方法(比如ContentType移除、SchemaEditor操作)之所以无效,是因为Django启动时已将所有应用和模型加载到内存中,运行时的这类修改不会影响django_apps的内存状态。最可靠的方案是使用单元测试Mock来模拟异常,无需修改真实的应用或模型注册。

方法1:模拟get_model()抛出LookupError

使用unittest.mock.patch替换django.apps.apps.get_model方法的行为,让它直接抛出异常:

from django.test import TestCase
from unittest.mock import patch
from django.apps import apps
from your_app.serializers import YourSerializer  # 替换为你的序列化器路径

class SerializerLookupErrorTest(TestCase):
    def test_recording_none_on_lookup_error(self):
        # 构造测试数据
        test_data = {"your_field": "value"}
        
        # 模拟get_model抛出LookupError
        with patch.object(apps, 'get_model') as mock_get_model:
            mock_get_model.side_effect = LookupError
            
            # 执行序列化器逻辑
            serializer = YourSerializer(data=test_data)
            self.assertTrue(serializer.is_valid())
            result = serializer.save()
            
            # 断言异常被正确处理,recording为None
            self.assertIsNone(result)

方法2:模拟get_app_config()抛出LookupError

如果需要测试get_app_config抛出异常的场景,同样用Mock替换该方法:

def test_app_config_lookup_error(self):
    test_data = {"your_field": "value"}
    
    with patch.object(apps, 'get_app_config') as mock_get_app_config:
        mock_get_app_config.side_effect = LookupError
        
        serializer = YourSerializer(data=test_data)
        self.assertTrue(serializer.is_valid())
        result = serializer.save()
        
        self.assertIsNone(result)

关键说明

  • Mock方式不会修改真实的应用注册或数据库,测试隔离性更好,执行速度更快。
  • 可以精准控制异常抛出的时机,单独测试get_model或get_app_config的异常分支。
  • 避免了SQLite等测试数据库环境下的操作限制,无需依赖迁移或Schema修改。

内容的提问来源于stack exchange,提问作者oon arfiandwi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 15:27:21