2015-03-24 65 views
5

我正在編寫一些代碼,檢查os.environ(我知道這不是最佳的,但我必須去用它)的值的測試。我想在測試期間從os.environ中刪除一個條目。我不確定模擬是否支持這一點。我知道patch.dict可用於修改項目,但我希望刪除鍵/值對。我想沿着這些線:使用Python的模擬臨時刪除字典中的對象

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不能這樣工作,因爲我做到了:)儘管你的解決方案適用於我。 – 2015-03-24 21:43:07

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

這似乎不是很穩定。如果測試在一半時間內失敗,我會被從os.environ中刪除的MY_THING卡住:( – 2015-03-24 21:36:41

+0

或使用'my_thing = os.environ.pop('MY_THING')'並省略'del'。 – 2015-03-24 21:40:30

+0

如果你想在一個與'with'一起工作的表單,用一個方法'__enter__'創建一個'DictDelete',它執行刪除操作,'__exit__'完成恢復操作,然後使用'with DictDelete()',我會很好地格式化它,但意見是有限的。 – Ken 2015-03-24 21:50:21