Python 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)
补充说明:你可以从这个网址查看 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