Django单元测试Mock配置遇AttributeError问题求助
问题分析与修复
错误根源
报错AttributeError: 'Settings' object has no attribute 'LOCAL_DB_LIB_DIR'的核心原因是:
utils.py在模块加载阶段(即被import时)就执行了平台判断和cx_Oracle初始化代码,直接读取settings中的配置项。@override_settings装饰器仅在测试方法运行时才会覆盖配置,而模块加载发生在测试方法执行之前,此时LOCAL_DB_LIB_DIR还未被注入到settings中,导致找不到该属性。
另外测试代码存在冗余导入:同时from common import utils和from utils import project,容易引发命名冲突,需要统一。
修复方案
1. 重构utils.py:延迟初始化逻辑
将模块级别的cx_Oracle初始化代码移到函数内部,避免在模块加载时直接读取settings。只有当实际需要使用数据库连接时才执行初始化,确保此时测试的配置已经生效。
修正后的utils.py:
# utils.py import platform from urllib import parse import cx_Oracle from django.conf import settings # 把Oracle初始化逻辑封装成函数,延迟到需要时调用 def init_oracle_client(): if platform.system() == 'Linux': cx_Oracle.init_oracle_client(lib_dir=settings.GAP_DB_LIB_DIR) else: cx_Oracle.init_oracle_client(lib_dir=settings.LOCAL_DB_LIB_DIR) # 示例:封装数据库连接函数,调用初始化逻辑 def get_db_connection(): init_oracle_client() return cx_Oracle.connect( user=settings.DB_USER, password=settings.DB_PASS, dsn=settings.DB_CONNECTION_DSN ) def project(repo): pieces = parse.urlsplit(repo) return pieces.path.rstrip('/').split('/')[-1]
2. 修正测试代码test.py
移除冗余导入,确保override_settings覆盖所有可能用到的配置项(即使测试project函数暂时不需要,也可以避免其他场景的报错):
from django.test import TestCase, override_settings from common import utils class UtilsTest(TestCase): def setUp(self): self.repo = "http://test/testrepo" @override_settings(LOCAL_DB_LIB_DIR="c:/testdir", GAP_DB_LIB_DIR="/tmp/testdir") def test_project(self): response = utils.project(self.repo) self.assertEqual(response, "testrepo")
额外说明
如果你的测试场景需要用到数据库连接,确保在测试方法内部调用init_oracle_client()或get_db_connection(),此时@override_settings的配置已经生效,不会再出现找不到配置项的问题。
内容的提问来源于stack exchange,提问作者Susmitha Thallapally
相关产品推荐
相关产品推荐

