集成测试中的模拟文件系统

17

我正在编写一个Ruby程序,执行一些外部的命令行工具。如何在我的Rspec测试中模拟文件系统,以便我可以轻松设置一些文件层次结构,并在测试后进行验证。最好还要实现在RAM中,这样测试将运行得更快。

我意识到,由于我的外部程序是直接与操作系统文件服务交互的本地程序,我可能找不到可移植的解决方案。Linux是我的主要平台,对此的解决方案就足够了。

3个回答

40

你是否已经查看了FakeFSMockFS

注意:原始的MockFS链接无法使用。据看起来是不再维护了。


非常好,Rspec助手已经发布! - Paul Brit
非常容易设置。强烈推荐给任何浏览的人。例如,对于简单的读写操作,这已经足够了(它肯定足以测试我的文件日志模块):https://github.com/fakefs/fakefs#temporarily-faking-the-fs - J.M. Janzen

8
也许这不会直接回答你的问题,但在这种情况下,我倾向于在测试设置期间创建一个临时目录,并在拆卸时将其删除。当然,您还必须确保应用程序写入此临时目录。我总是有一个配置选项来定义目标目录,在测试期间可以覆盖它。
当涉及到断言时,我使用普通的File.exist?File.directory?,但当然您也可以创建自己的包装器。如果您需要一些初始状态,可以构建一个目录,该目录可用作夹具,并将被复制到测试设置期间的临时目录中。

这可能适用于ramdisk文件系统,但我正在寻找更高级的解决方案。 - JtR
你在哪里创建临时目录?创建和删除 /tmp/my_test_dir 是安全的吗? - Sebastian vom Meer

6
您可以创建一个大文件(您虚拟磁盘的大小)并将该文件挂载为回环设备。您可以在此设备上创建任何文件系统和目录结构。
您可以创建两个这样的设备,甚至可以进行简单的差异比较以确保测试后的数据完整性。
我希望我正确理解了您的要求,因为我不确定为什么简单的RAM磁盘解决方案不够好。
这个链接也可能相关。

2
这是一个非常极客的答案,但对大多数 Ruby 程序员来说可能并不适用。不过,它应该可以工作。我会为了极客因素点赞。 :-) - Clint Pachl
我会把这当作一种赞美 :) - Ilya
你可以使用unionfs将这个线程推进一步:http://en.wikipedia.org/wiki/UnionFS - Frobbit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接