如何替换被测模块的文件访问引用

int*_*ted 7 python testing file-io unit-testing mocking

pyfakefs 听起来非常有用:它"最初是作为核心Python模块的适度伪造实现而开发的,用于支持中等复杂的文件系统交互,并于2006年9月在全谷范围内推出.从那时起,它已经收到了很多(经过充分测试) )扩展其功能和实用性的贡献,并用于900多个Google Python测试."

文档似乎目前仅在源代码本身的文档字符串中可用.它解释说该模块提供以下元素:

  • FakeFile:提供真实文件的外观.
  • FakeDirectory:提供真实目录的外观.
  • FakeFilesystem:提供真实目录层次结构的外观.
  • FakeOsModule:使用FakeFilesystem提供假的os模块替换.
  • FakePathModule:伪造的os.path模块替换.
  • FakeFileOpen:伪造的文件()和open()函数替换.

但是,文档没有解释如何在测试中有效地使用这些元素.

确保被测模块访问虚假文件系统而不是真实文件系统的正确方法是什么?

MrB*_*men 1

由于原来的答案已被删除,我将添加一个新答案,以防有人无意中发现这一点。
免责声明:我是pyfakefs.

虽然在撰写问题时情况并非如此,但答案现在主要包含在文档中。总而言之,有 4 种不同的可能性如何使用来模拟所有文件系统功能pyfakefs

  • with pytest: 只需使用fs插件
  • with unittest:从中导出您的测试pyfakefs.fake_filesystem_unittest.TestCaseself.setUpPyfakefs()调用setUp
  • 与其他测试框架:使用pyfakefs.fake_filesystem_unittest.Patcher,作为上下文管理器,或在修补程序实例上使用setUp/tearDown
  • 作为独立的装饰器:导入pyfakefs.fake_filesystem_unittest.patchfs并将其用作测试函数的装饰器 ( @patchfs)

所有这些变体都允许进行一些自定义,并且可以在假文件系统实例上调用一些方便的方法(例如定义文件系统的字节大小),但这些都是可选的。只需使用其中一种方法即可将所有 Python 文件系统调用替换为对模拟(基于内存)文件系统的调用。

另请注意,存在一些限制的适用性的限制pyfakefs