2015-03-24 1 views
5

Я пишу тест для некоторого кода, который проверяет значение в os.environ (я знаю, что это не оптимально, но я должен пойти с ним). Я хотел бы удалить запись из os.environ в течение всего теста. Я не уверен, что макет поддерживает это. Я знаю, что patch.dict может использоваться для изменения элемента, но я хочу, чтобы пара ключ/значение удалялась. Мне хотелось бы что-то в этом направлении:Использование python mock для временного удаления объекта из 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', ... } 

Есть ли способ совершить такой подвиг?

ответ

9

mock.patch.dict не совсем работает, как ваш образец желаемого кода. patch.dict - это функция, которая требует аргумента. Вероятно, вы хотите использовать его так:

>>> 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 не работает, потому что я это сделал :) Ваше решение работает для меня. –

3

Для удаления элемента, вы можете просто использовать:

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

А затем восстановить его:

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

Это кажется не очень стабильным. Если тест завершился неудачно, я застрял с MY_THING, удаленным из os.environ :( –

+0

Или используйте 'my_thing = os.environ.pop ('MY_THING')' и опустите 'del'. –

+0

Если вы хотите его форма, которая работает с 'with', создает класс' DictDelete' с методом '__enter__', который выполняет удаление, и' __exit__', который выполняет восстановление. Затем используйте 'with DictDelete()'. Я бы отформатировал его красиво , но комментарии ограничены. – Ken

Смежные вопросы