Ruby的假文件系统

时间:2012-04-22 19:02:25

标签: ruby file filesystems virtual

我需要一些代码将实际的文件系统伪造成伪造的。因此,当我启动它时会将/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 个答案:

答案 0 :(得分:2)

你有两个选择:

选项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。