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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:02:09