我正在用 Python 为 ConfigParser 编写一个包装器,以提供一个简单的接口(interface)来存储和检索应用程序设置。
包装器有两个方法,read 和 write,以及一组用于不同应用程序设置的属性。
write 方法只是 ConfigParser 的 write 方法的包装器,另外还创建了配置解析器。它看起来像这样:
def write(self):
f = open(self.path, "w")
try:
self.config_parser.write(f)
finally:
f.close()
我想编写一个单元测试,断言如果无法写入文件并且在其他情况下调用了配置解析器的 write 方法,则此方法会引发 IOError。
第二个测试使用模拟对象很容易处理。但是 open 调用让事情变得有点棘手。最终我必须创建一个文件对象以传递给配置解析器。运行这段代码时实际上会创建一个文件这一事实并不能使它对单元测试非常有用。是否有一些模拟文件创建的策略?可以通过某种方式测试这段代码吗?还是它太简单而无法测试?
请您参考如下方法:
首先,您实际上不需要对 open() 进行单元测试,因为假设标准库是正确的是非常合理的。
接下来,您不想执行文件系统操作来让 open() 生成您想要的错误,因为这样您就不是在进行单元测试,而是在执行功能/通过包含文件系统进行集成测试。
因此,您或许可以将全局命名空间中的 open() 替换为仅引发 IOError 的代理项。不过,如果继续执行,可能需要确保将东西放回去。
但说到底,测试有什么值(value)呢?该代码片段中几乎没有属于您自己的系统。甚至替换 open() 实际上最终只是一个测试,它说“Python 中的 try 和 finally 语句是否有效?”
我的建议?只需在记录您的期望的文档字符串中添加一条语句即可。 “如果无法写入文件,则引发 IOError。”然后继续前进。如果此方法变得有些复杂(和测试值(value)),您可以稍后添加单元测试。
