2015-03-24 17 views
5

Tôi đang viết một kiểm tra cho một số mã kiểm tra giá trị trong os.environ (Tôi biết điều này không phải là tối ưu, nhưng tôi phải đi với nó). Tôi muốn loại bỏ một mục từ os.environ trong suốt thời gian thử nghiệm. Tôi không chắc chắn nếu giả hỗ trợ này. Tôi biết patch.dict có thể được sử dụng để sửa đổi một mục, nhưng tôi muốn loại bỏ cặp khóa/giá trị. Tôi muốn một cái gì đó dọc theo các dòng này:Sử dụng giả của python để tạm thời xóa một đối tượng khỏi số 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ó cách nào để thực hiện một kỳ tích như vậy không?

Trả lời

9

mock.patch.dict không hoàn toàn làm việc như mã mong muốn mẫu của bạn. patch.dict là một hàm yêu cầu đối số. Bạn có thể muốn sử dụng nó như thế này:

>>> 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 không hoạt động như thế, bởi vì tôi đã tạo ra nó :) Giải pháp của bạn làm việc cho tôi. –

3

Đối xóa các mục, bạn chỉ có thể sử dụng:

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

Và sau đó khôi phục lại nó với:

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

Điều đó có vẻ không ổn định. Nếu thử nghiệm thất bại nửa chừng, tôi bị kẹt với MY_THING bị xóa khỏi os.environ :( –

+0

Hoặc sử dụng 'my_thing = os.environ.pop ('MY_THING')' và bỏ qua 'del'. –

+0

Nếu bạn muốn nó một biểu mẫu hoạt động với 'with', tạo một lớp' DictDelete' với phương thức '__enter__' để xóa và' __exit__' thực hiện việc khôi phục. Sau đó dùng 'with DictDelete()'. – Ken

Các vấn đề liên quan