使用 python 的模拟从字典中暂时删除对象



我正在为一些代码编写一个测试,以检查os.environ中的值(我知道这不是最佳的,但我必须接受它)。我想在测试期间从os.environ中删除一个条目。我不确定mock是否支持这一点。我知道patch.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', ... }

有办法完成这样的壮举吗?

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

要删除项目,只需使用:

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

然后用恢复

os.environ['MY_THING'] = my_thing

对于那些使用Pytest的人,请注意,涉及上下文管理器的答案不起作用。相反,Pytest为Mocker提供了一个内置的fixture,它自动假设上下文管理器滚动:

import os
def test_before_change():
    print('before change: ' + os.environ['PATH'])
def test_env_change(mocker):
    mock.patch.dict(os.environ)
    del os.environ['PATH']
    print('PATH would go here...if I had one! ' + os.environ['PATH']) 

def test_before_change():
    print('after change: ' + os.environ['PATH'])

# now run the pytest

最新更新