Jestem nowy w testowaniu jednostkowym. Chcę przeczytać kilka zmiennych env w testach jednostkowych django, ale mam pewne problemy podczas próby odczytania zmiennej env z django.conf.settings, ale mogę ją odczytać za pomocą os.environ.get(). Jak mogę uzyskać dostęp do bieżącej zmiennej env z django.conf.settings?

Kod testowy wygląda następująco:

from unittest.mock import patch

    
    def test_functionality_in_non_production_environments(self):
        with patch.dict('os.environ', {
            'ENVIRONMENT': 'local',
            'ENV_VALUE': 'test_env_value',
        }):
            from django.conf import settings
            print(settings.ENV_VALUE)           # --> DOES NOT PRINT 'test_env_value'
            print(os.environ.get('ENV_VALUE'))  # --> PRINTS 'test_env_value'

W settings.py:

ENV_VALUE = os.environ.get('ENV_VALUE', 'some other value')

Próbuję przetestować poprawne zachowanie kodu w zależności od env var.

W niektórych częściach kodu istnieje pewna logika, taka jak:

if settings.ENV_VALUE and setting.ENVIRONMENT == 'local':
    # do some stuff
0
David Emanuel Sandoval 24 styczeń 2022, 17:15
Czy musisz zastąpić ustawienia? To może pomóc: docs.djangoproject.com/en/4.0 /topics/testowanie/narzędzia/…. Czy zaimportowałeś już gdzieś django.conf.settings? Jeśli tak, został skonfigurowany i przypuszczam, że django.conf.settings.ENV_VALUE ma ENV_VALUE zbuforowany (w postaci str/list/...), a nie jako os.getenv(...), więc modyfikacja środowiska nie wpływają na ustawienia.
 – 
SUTerliakov
24 styczeń 2022, 17:23

1 odpowiedź

Najlepsza odpowiedź

Możesz nadpisać ustawienia django za pomocą override_settings dekorator:

from django.test import TestCase, override_settings

@override_settings(ENV_VALUE='test_env_value', ENVIRONMENT='local')
def test_functionality_in_non_production_environments(self):
    from django.conf import settings
    print(settings.ENV_VALUE)           
    print(os.environ.get('ENV_VALUE'))  
0
neverwalkaloner 24 styczeń 2022, 17:23
Tak, nadpisywanie ustawień działa bezpośrednio. W moim przypadku będę musiał również użyć patch.dict na wypadek, gdyby kod miał dostęp do zmiennej env bezpośrednio, a nie przez conf.settings, ponieważ nadpisanie ustawień django nie wydaje się również modyfikować zmiennej środowiskowej.
 – 
David Emanuel Sandoval
24 styczeń 2022, 17:48