Python SafeConfigParser 模拟

1 投票
1 回答
1611 浏览
提问于 2025-04-17 23:05

我正在学习如何在单元测试程序中使用模拟。

现在我有一个 SafeConfigParser 对象,我想测试我写的内容是否正确。

在网上查了关于 SafeConfigParser 的模拟用法后,我已经知道如何测试它的读取功能了。但我仍然不知道如何验证它的写入功能。

我的想法是:

  1. 先创建一个空的缓冲区。
  2. 考虑一个方法,可以把这个缓冲区设置到 SafeConfigParser 中。
  3. 调用包含 SafeConfigParser.write() 的函数。
  4. 用我的答案来验证这个缓冲区。

我需要测试的程序大致如下:

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)

补充说明:你可以从这个网址查看 read 部分: http://www.snip2code.com/Snippet/4347/

1 个回答

1

我终于找到了解决办法 :).

我把我的程序(比如说: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'),
                    ]
                )

参考链接: http://docs.python.org/dev/library/unittest.mock#mock-open

撰写回答