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'))
Вернуться на верх