如何在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
相关产品推荐
相关产品推荐

