2015-03-24 7 views
5

Piszę test dla jakiegoś kodu, który sprawdza wartość w os.environ (Wiem, że to nie jest optymalne, ale muszę iść z tym). Chciałbym usunąć wpis z os.environ na czas trwania testu. Nie jestem pewien, czy mock popiera to. Wiem, że patch.dict można użyć do modyfikacji elementu, ale chcę, aby usunięto parę klucz/wartość. Chciałbym coś w tym stylu:Używanie makiety Pythona do tymczasowego usunięcia obiektu z dyktafonu

print os.environ 
{ ... , 'MY_THING': 'foo', ... } 

with mock.patch.dict.delete('os.environ', 'MY_THING'): 
    # run the test 
    # ('MY_THING' in os.environ) should return False 

# everything back to normal now  
print os.environ 
{ ... , 'MY_THING': 'foo', ... } 

Czy istnieje sposób na wykonanie takiego wyczynu?

Odpowiedz

9

mock.patch.dict nie bardzo działa jak próbka żądanego kodu. patch.dict to funkcja wymagająca argumentu. Prawdopodobnie chcesz go użyć w następujący sposób:

>>> import os 
>>> import mock 
>>> with mock.patch.dict('os.environ'): 
...  del os.environ['PATH'] 
...  print 'PATH' in os.environ 
... 
False 
>>> print 'PATH' in os.environ 
True 
+0

mock.patch.dict nie działa w ten sposób, ponieważ go wymyśliłem :) Twoje rozwiązanie działa jednak dla mnie. –

3

Do usuwania elementu, można po prostu użyć:

my_thing = os.environ['MY_THING'] # Gotta store it to restore it later 
del os.environ['MY_THING'] 

a następnie przywrócić go z:

os.environ['MY_THING'] = my_thing 
+0

To wydaje się niezbyt stabilne. Jeśli test nie powiedzie się w połowie, utknąłem z MY_THING usuniętym z os.environ :( –

+0

Lub użyj 'my_thing = os.environ.pop ('MY_THING')' i pomiń 'del'. –

+0

Jeśli chcesz to w formularz, który działa z 'with', utwórz klasę' DictDelete' z metodą '__enter__', która wykonuje usunięcie, i' __exit__', która wykonuje przywracanie, a następnie użyj 'with DictDelete()'. Formatowałbym to ładnie , ale komentarze są ograniczone – Ken

Powiązane problemy