Декоратор override_settings
Декоратор override_settings применяется к тестовым методам или классам
и позволяет временно переопределить значения параметров настроек Django
на время выполнения теста. После завершения теста исходные значения
восстанавливаются автоматически. Декоратор принимает произвольное
количество именованных аргументов, где имя аргумента соответствует
ключу в настройках, а значение - новому значению для этого ключа.
Синтаксис
from django.test import override_settings
@override_settings(SETTING_NAME='new_value')
def test_method(self):
# Тестовый код
pass
Пример
Давайте проверим, как изменяется поведение функции при
изменении настройки DEBUG:
from django.test import TestCase, override_settings
from django.conf import settings
class SettingsTest(TestCase):
def test_debug_true(self):
with override_settings(DEBUG=True):
self.assertTrue(settings.DEBUG)
# Проверяем поведение при DEBUG=True
res = "Debug mode is enabled"
print(res)
def test_debug_false(self):
with override_settings(DEBUG=False):
self.assertFalse(settings.DEBUG)
# Проверяем поведение при DEBUG=False
res = "Debug mode is disabled"
print(res)
Результат выполнения кода:
"Debug mode is enabled"
"Debug mode is disabled"
Пример
Декоратор можно применять ко всему классу тестов, чтобы все методы использовали переопределенные настройки:
from django.test import TestCase, override_settings
from django.conf import settings
@override_settings(LANGUAGE_CODE='ru-ru', TIME_ZONE='Europe/Moscow')
class LocalizationTest(TestCase):
def test_language_code(self):
self.assertEqual(settings.LANGUAGE_CODE, 'ru-ru')
res = "Language code is set to Russian"
print(res)
def test_timezone(self):
self.assertEqual(settings.TIME_ZONE, 'Europe/Moscow')
res = "Timezone is set to Moscow"
print(res)
Результат выполнения кода:
"Language code is set to Russian"
"Timezone is set to Moscow"
Пример
Декоратор можно использовать для изменения настроек базы данных, чтобы тестировать приложение с разными движками:
from django.test import TestCase, override_settings
from django.conf import settings
class DatabaseSettingsTest(TestCase):
@override_settings(
DATABASES={
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': ':memory:'
}
}
)
def test_memory_database(self):
db_engine = settings.DATABASES['default']['ENGINE']
self.assertIn('sqlite3', db_engine)
res = "Using SQLite in-memory database"
print(res)
Результат выполнения кода:
"Using SQLite in-memory database"
Смотрите также
-
декоратор
modify_settings,
который позволяет изменять настройки, содержащие списки или словари -
класс
TestCase,
который предоставляет базовую функциональность для написания тестов -
класс
SimpleTestCase,
который используется для тестов без доступа к базе данных -
класс
TransactionTestCase,
который используется для тестирования транзакций