Ric*_*erg 1 python file-io unit-testing
我正在为ConfigParserPython 编写一个包装器,以提供一个用于存储和检索应用程序设置的简单界面.
包装器有两种方法,read以及write一组用于不同应用程序设置的属性.
该write方法仅仅是用于一个包装ConfigParser的write与所述另外的也产生由所需的文件对象的方法ConfigParser.它看起来像这样:
def write(self):
f = open(self.path, "w")
try:
self.config_parser.write(f)
finally:
f.close()
Run Code Online (Sandbox Code Playgroud)
我想编写一个单元测试,声明如果无法写入该文件,则此方法会引发IOError,而在另一种情况下,会调用config解析器的write方法.
使用模拟对象很容易处理第二个测试.但这个open电话让事情变得有点棘手.最终我必须创建一个文件对象以传递给配置解析器.在运行此代码时实际创建文件这一事实并不能使它对单元测试非常有用.是否有一些模拟文件创建的策略?可以用某种方式测试这段代码吗?或者它是否太简单了?
首先,您实际上不需要进行单元测试open(),因为假设标准库是正确的是非常合理的.
接下来,您不希望进行文件系统操作来open()生成所需的错误,因为那时您不是单元测试,而是通过包含文件系统来进行功能/集成测试.
所以你可以open()在全局命名空间中替换一个只引发一个的代理IOError.但是,如果执行继续,可能需要确保你把东西放回去.
但最终,测试有什么价值?代码片段中的内容很少,这是您自己的系统.即使替换open()真的只是最终成为一个测试,说" Python 中的try和finally声明是否有效?"
我的建议?只需在docstring中添加一条记录您期望的语句即可."如果无法写入文件,则会引发IOError." 然后继续前进.如果此方法获得一些复杂性(以及测试的优点),您可以稍后添加单元测试.
实际上,只有 open 才会在代码中引发异常。write() 的文档没有提及任何有关异常的内容。可能只是一个 ValueError 或一些错误的文件指针(由于打开失败,这里不可能是这种情况)。
为打开创建 IOError 很容易。只需在其他地方创建文件并打开它以便在那里写入即可。或者您可以更改它的权限,这样您就没有访问权限。
你可能想使用with在此处使用该语句,它会自行处理关闭。
在 python 2.5 中,您需要第一行。在以后的版本中您不需要它。
from __future__ import with_statement # python 2.5 only
def write(self):
with open(self.path, 'w') as f:
self.config_parser.write(f)
Run Code Online (Sandbox Code Playgroud)
如果成功,则保证调用 write 方法,如果引发open则不会调用write 方法。我不知道为什么您需要测试来查看是否调用了 write 。代码说确实如此。不要过度测试。;)openIOError