我们可以创建数据库,在 Django 测试用例的设置文件中添加配置,并在测试用例运行后删除数据库并删除配置吗?

问题描述 投票:0回答:0

实际上,我在 Django 中有一个 API 端点,我在其中运行一个脚本,该脚本在运行时创建数据库并在设置文件中添加配置。 当我为该端点编写测试用例时,它在拆除测试用例时抛出以下错误。

错误:tearDownClass(tenants.tests.test_apis.test_tenant_apis.TenantCreationTests)

回溯(最后一次通话): 文件“/home/dev/Documents/MUSEAPI/muse-api/venv/lib/python3.8/site-packages/django/test/testcases.py”,第 372 行,在 _remove_databases_failures setattr(连接,名称,方法。包装) AttributeError: 'function' 对象没有属性 'wrapped'

下面是脚本,我用它来配置数据库

import json

import environ
import psycopg2
from django.conf import settings
from django.core.management import call_command

env = environ.Env(
  DEBUG=(bool, False)
)
environ.Env.read_env()


def configure_db_script(db_name):

    db_configuration = {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': db_name,
        'USER': env('DATABASE_USER'),
        'PASSWORD': env('DATABASE_PASSWORD'),
        'HOST': env('DATABASE_HOST'),
        'PORT': env('DATABASE_PORT'),
    }

    db_configuration1 = {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': db_name,
        'USER': env('DATABASE_USER'),
        'PASSWORD': env('DATABASE_PASSWORD'),
        'HOST': env('DATABASE_HOST'),
        'PORT': env('DATABASE_PORT'),
        'ATOMIC_REQUESTS': False,
        'AUTOCOMMIT': True,
        'CONN_MAX_AGE': 0,
        'CONN_HEALTH_CHECKS': False,
        'OPTIONS': {},
        'TIME_ZONE': None,
        'TEST': {
            'CHARSET': None,
            'COLLATION': None,
            'MIGRATE': True,
            'MIRROR': None,
            'NAME': None
        }
    }

    default_connection = psycopg2.connect(
        database='postgres',
        user=env('DATABASE_USER'),
        password=env('DATABASE_PASSWORD'),
        host=env('DATABASE_HOST'),
        port=env('DATABASE_PORT'),
    )

    settings.DATABASES[db_name] = db_configuration1

    with default_connection.cursor() as cursor:
        default_connection.autocommit = True
        cursor.execute(f'CREATE DATABASE {db_name}')

    with open('settings.py', 'r') as f:
        data = f.readlines()
    with open('settings.py', 'w') as f:
        for line in data:
            if line.startswith('DATABASES'):
                db_json = json.dumps(db_configuration, indent=4)
                configured_json = configure_json(db_json, db_name)
                f.write('DATABASES = ' + '{' + configured_json + '\n')
            elif line.startswith('ALLOWED_HOSTS'):
                f.write('ALLOWED_HOSTS = ' + '[\n' + '\'' + db_name + '\'' + ',')
            else:
                f.write(line)

    call_command('migrate', database=db_name, app_label='users')

    settings.ALLOWED_HOSTS.append(db_name)


def configure_json(data, db_name):
    data = '\n' + '\'' + str(db_name) + '\'' + ': ' + str(data) + ','
    return data

我不明白实际的错误。我试过模拟端点,但做不到。 任何有帮助的人都将不胜感激

python django database postgresql testcase
© www.soinside.com 2019 - 2024. All rights reserved.