2015-03-24 24 views
5

Sto scrivendo un test per un codice che controlla un valore in os.environ (so che questo non è ottimale, ma devo andare con esso). Vorrei rimuovere una voce da os.environ per la durata del test. Non sono sicuro che la simulazione supporti questo. So che lo patch.dict può essere utilizzato per modificare un elemento, ma voglio rimuovere la coppia chiave/valore. Vorrei qualcosa seguendo queste linee:Utilizzo di Python's mock per eliminare temporaneamente un oggetto da un dict

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', ... } 

C'è un modo per eseguire una tale impresa?

risposta

9

mock.patch.dict funziona non proprio come il tuo codice desiderato del campione. patch.dict è una funzione che richiede un argomento. Probabilmente vuoi usarlo in questo modo:

>>> 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 non funziona così, perché l'ho inventato :) La tua soluzione funziona comunque per me. –

3

Per cancellare la voce, si può semplicemente utilizzare:

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

E poi ripristinarla con:

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

Sembra non molto stabile. Se il test fallisce a metà, sono bloccato con MY_THING cancellato da os.environ :( –

+0

O uso 'my_thing = os.environ.pop ('MY_THING')' e ometto il 'del'. –

+0

Se lo vuoi una forma che funziona con 'with', crea una classe' DictDelete' con un metodo '__enter__' che esegue la cancellazione e' __exit__' che esegue il ripristino, quindi usa 'con DictDelete()'. , ma i commenti sono limitati – Ken

Problemi correlati