Python安全配置解析器模拟

Python安全配置解析器模拟,python,unit-testing,mocking,Python,Unit Testing,Mocking,我正在研究如何在单元测试程序中使用模拟 现在我有了一个SafeConfigParser对象,我想测试我写的东西是否正确 在谷歌模拟使用了SafeConfigParser之后,我已经知道如何测试SafeConfigParser的读取。但是我仍然不知道如何验证SafeConfigParser的编写 我的想法是: 创建一个空缓冲区 考虑一种可以将缓冲区设置为SafeConfigParser的方法 调用包含SafeConfigParser.write()的函数 用我的答案验证缓冲区 我需要测试的程序如下

我正在研究如何在单元测试程序中使用模拟

现在我有了一个
SafeConfigParser
对象,我想测试我写的东西是否正确

在谷歌模拟使用了
SafeConfigParser
之后,我已经知道如何测试
SafeConfigParser
的读取。但是我仍然不知道如何验证
SafeConfigParser
的编写

我的想法是:

  • 创建一个空缓冲区
  • 考虑一种可以将缓冲区设置为
    SafeConfigParser
    的方法
  • 调用包含
    SafeConfigParser.write()的函数
  • 用我的答案验证缓冲区
  • 我需要测试的程序如下:

    def write_tokens_to_config(self):
        """Write token values to the config
        """
    
        parser = SafeConfigParser()
        with open(self.CONFIG_PATH) as fp:
            parser.readfp(fp)
            if not parser.has_section('Token'):
                parser.add_section('Token')
        parser.set('Token', 'access_token', self._access_token)
        parser.set('Token', 'refresh_token', self._refresh_token)
        with open(self.CONFIG_PATH, 'wb') as fp:
            parser.write(fp)
    

    另外,您可以查看此url中的
    阅读
    部分:

    我终于找到了解决方案:)

    我将我的程序(例如:
    program.py
    )修改为以下内容:

    class Program(): 
    
        def __init__(self):
            self._access_token = None
            self._refresh_token = None
            self.CONFIG_PATH = 'test.conf'
    
        def write_tokens_to_config(self):
            """Write token value to the config
            """
    
            parser = SafeConfigParser()
            parser.read(self.CONFIG_PATH)
            if not parser.has_section('Token'):
                parser.add_section('Token')
            parser.set('Token', 'access_token', self._access_token)
            parser.set('Token', 'refresh_token', self._refresh_token)
            with open(self.CONFIG_PATH, 'wb') as f:
                parser.write(f)
    
    我的测试程序是这样的:

    class TestMyProgram(unittest.TestCase):
    
        def setUp(self):
            from program import Program
            self.program = Program()
    
        def test_write_tokens_to_config(self):
            from mock import mock_open
            from mock import call
            self.program._access_token = 'aaa'
            self.program._refresh_token = 'bbb'
            with mock.patch('program.ConfigParser.SafeConfigParser.read'):
                m = mock_open()
                with mock.patch('__builtin__.open', m, create=True):
                    self.program.write_tokens_to_config()
                    m.assert_called_once_with(self.program.CONFIG_PATH, 'wb')
                    handle = m()
                    handle.write.assert_has_calls(
                        [
                            call('[Token]\n'),
                            call('access_token = aaa\n'),
                            call('refresh_token = bbb\n'),
                        ]
                    )
    
    参考: