Override_settings не работает во время выполнения с pytest DJANGO
В моем файле settings.py внутри моего django proyect я добавил новую константу ALLOW_SELF_REGISTRATION
, эта константа разрешает или не разрешает url в proyect таким образом:
if settings.ALLOW_SELF_REGISTRATION:
urlpatterns += [path(
"self_registration/", views.self_registration_client, name="self_registration"
),]
Моя проблема в том, что мне нужно проверить, когда эта константа установлена в False
в этом случае url не должен быть добавлен и тест на этот url должен вызывать ошибку NoReverseMatch
.
Я обнаружил, что override_settings не работает, как ожидалось, я делаю различные попытки, чтобы посмотреть, может ли что-нибудь сработать, но нет.
До сих пор я пытался:
def test_constant_on_change_edit_urls_on_false(client):
with override_settings(ALLOW_SELF_REGISTRATION=False):
with pytest.raises(NoReverseMatch):
response = client.get(reverse('profiles:self_registration'))
Если я печатаю, то значение константы в этом тесте устанавливается в True
(по умолчанию), а не False
, как должно быть по override_settings
контекстному менеджеру.
Мне нужен способ переопределить эту константу во время выполнения внутри тестов, чтобы я мог проверить эту функциональность. Также пробовал:
@override_settings(ALLOW_SELF_REGISTRATION=False)
def test_constant_on_change_edit_urls_on_false(client):
with pytest.raises(NoReverseMatch):
response = client.get(reverse('profiles:self_registration'))
Но также потерпел неудачу.
Есть ли способ изменить это значение во время выполнения тестов?
Вчера я столкнулся с точно такой же проблемой!
Вы можете решить эту проблему с помощью monkeypatching объекта settings. Применив его к вашей ситуации, вы получите что-то вроде этого:
import sys
from importlib import reload as reload_module
import pytest
from django.urls import NoReverseMatch, clear_url_caches, reverse
def reload_modules(*modules):
for module in modules:
reload_module(sys.modules[module])
def test_constant_on_change_edit_urls_on_false(client, monkeypatch, settings):
# monkeypatch settings property:
monkeypatch.setattr("your_project.urls.settings.ALLOW_SELF_REGISTRATION", False)
# reload url configs
reload_modules("your_project.urls", settings.ROOT_URLCONF)
# clear the aggressively cached urls
clear_url_caches()
# continue with the test:
with pytest.raises(NoReverseMatch):
response = client.get(reverse('profiles:self_registration'))