How to replace file-access references for a module under test
pyfakefs听起来非常有用:"它最初是作为核心Python模块的适度虚假实现而开发的,以支持中等复杂的文件系统交互,并于2006年9月在Google范围内推出。经过充分测试的)贡献,以扩展其功能和实用性,并且已在900多个Google Python测试中使用。"
文档似乎仅在源代码本身的文档字符串中可用。它说明该模块提供以下元素:
-
FakeFile:提供真实文件的外观。
-
FakeDirectory:提供真实目录的外观。
-
FakeFilesystem:提供真实目录层次结构的外观。
-
FakeOsModule:使用FakeFilesystem提供伪造的os模块替换。
-
FakePathModule:伪造的os.path模块替换。
-
FakeFileOpen:伪造的file()和open()函数替换。
但是,文档没有说明如何在测试中有效使用这些元素。
确保被测模块访问假文件系统而不访问真实文件系统的正确方法是什么?
-
我认为您在文档字符串中发现的那些API基本上就是您在测试中需要调用的API。因此,您可以将其放在单独的测试方法,安装程序或setupClass(或tearDown *)中。还有什么困扰着你?
-
我不清楚如何让被测模块使用我使用fake_filesystem API创建的文件系统。我认为例如为我的模块类或函数提供file()函数仅仅是为了启用测试是没有道理的。我宁愿希望以"仁慈的猴子修补"方式以类似于此答案的方式来执行此操作,但我不确定究竟该如何修补猴子。
-
如果您必须从一开始就进行猴子修补,就没有那么容易。您可以从Python中检出模拟库,并通过提供要让类返回的对象来使用它模拟某些操作。从现在开始,我可以考虑一两天。同时,我将看看其他人是否可以给您一些想法。另一种方法是依赖注入-但是,如果您的函数或方法显式传递某些依赖关系(例如,类似文件的对象或数据库会话对象),则该方法可行且有意义。
-
我正在尝试测试的代码正在使用文件系统做一些复杂的事情,例如扫描文件和读取配置。我想验证它在那些文件的正确位置中查找并正确解释了这些文件中的信息。我也想知道如何在未来的测试中使用这种技术。
请参阅http://github.com/jmcgeheeiv/pyfakefs,以获取支持unittest和doctest的代码,以及一个实际的示例和教程。