[英]How can I patch a ConfigParser key/value?
当我使用以下代码时:
from unittest import mock
import configparser
configtext = '''
[SECTION]
whatever=True
'''
config = configparser.ConfigParser()
config.read_string(configtext)
def test_fails():
expected_value = 'fnord'
with mock.patch.dict(config, {'db': expected_value}):
assert config['db'] is expected_value
我的测试失败,因为AttributeError: 'str' object has no attribute 'items'
。
这根本不是我所期望的。 显然,我希望它可以像我想要的那样设置值...但是很显然,不幸的是,config仅是字典式的。
我该如何打补丁,以便config['db']
是我想要的值,仅在测试期间?
看来问题是我有点误会。 尽管ConfigParser
看起来像字典,但实际上并非如此。 堆栈跟踪包含以下证据:
def test_fails():
expected_value = 'whatever'
> with mock.patch.dict(config, {'db': expected_value}):
test.py:15:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.5/unittest/mock.py:1593: in __enter__
self._patch_dict()
/usr/lib/python3.5/unittest/mock.py:1619: in _patch_dict
in_dict[key] = values[key]
/usr/lib/python3.5/configparser.py:969: in __setitem__
self.read_dict({key: value})
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <configparser.ConfigParser object at 0x7f1be6d20f98>, dictionary = {'db': 'whatever'}
source = '<dict>'
请注意,它正在尝试在此处执行read_dict
。 那是因为它期望采用分段式的格式:
>>> parser = configparser.ConfigParser()
>>> parser.read_dict({'section1': {'key1': 'value1',
... 'key2': 'value2',
... 'key3': 'value3'},
... 'section2': {'keyA': 'valueA',
... 'keyB': 'valueB',
... 'keyC': 'valueC'},
... 'section3': {'foo': 'x',
... 'bar': 'y',
... 'baz': 'z'}
... })
来自文档
单键访问是不可能的。 要使此示例正常工作,您必须执行以下操作:
with mock.patch.dict(config, {'db': {'db': expected_value}}):
# rest of code
注意:值将转换为与之对应的严格值。 因此,如果您尝试在此处存储实际的数据库连接(或类似数据库),它将无法正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.