3

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

我想在 上制作一个文件/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. 有没有办法做到这一点?谢谢!

4

1 回答 1

2

你有两个选择:

选项 1 - 使用宝石伪造它

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。

于 2012-04-23T18:44:58.297 回答