繁体   English   中英

如何修补ConfigParser键/值?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM