Ruby的假文件系统

我需要一些代码将实际的文件系统伪造成假的。 因此,当我启动它时,它将/home/user/Documents/fake_fs/ ,因此每个DirFile调用都会转到该目录。 一个例子:

我想在/some_file上创建一个文件,所以我使用:

 File.open('/some_file', 'w') do |f| f.puts 'something on this file' end 

它会将它写在/home/user/Documents/fake_fs/some_file而不是/some_file 。 有没有办法做到这一点? 谢谢!

你有两个选择:

选项1 – 使用Gem伪造它

假冒某些文件系统操作不起作用, FakeFS将完全按照您的意愿执行操作。 FakeFS在Ruby标准库中重写了各种文件操作调用,因此可能会遗漏某些内容,或者某些内容可能无法正常工作。

选项2 – 重新编写代码以使其更易于测试

您基本上是硬编码/作为应用程序开始查找文件的根源。 如果您将此配置为可配置,则您的代码可以对此进行操作以进行测试。

例如:

 $root = ENV['ROOT_DIR'] || '/' File.open(File.join($root,'some_file'),'w') do |file| # whatever end 

然后,您的测试可以将ROOT_DIR设置为您想要设置的位置。

chroot也可能有助于这样做,例如

 Dir.chroot(ENV['ROOT_DIR'] || '/') File.open('/some_file','w') do |file| # whatever end 

有关更多内容,请参阅man chroot

就个人而言,我选择2。