【问题标题】:Fake filesystem for RubyRuby 的假文件系统
【发布时间】:2012-04-22 19:02:24
【问题描述】:

我需要一些将实际文件系统伪装成伪造文件系统的代码。因此,当我启动它时,它会将/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。有没有办法做到这一点?谢谢!

【问题讨论】:

  • 认为 chroot会实现这一点。
  • 好吧,我一开始就想到了,但是在阅读了文档之后,我认为它不适合它。这将是一些在运行时将所有文件系统调用“重定向”到伪造路径的代码
  • 我想fakefs gem 可能就是你要找的东西:github.com/defunkt/fakefs
  • 我也看了fakefs,但它只是为测试而设计的,而不是为实际代码设计的(我认为)
  • chroot 会是更安全的选择,否则你可以看看 fuse:debian-administration.org/articles/619

标签: ruby file filesystems virtual


【解决方案1】:

你有两个选择:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-24
    • 2011-01-01
    • 1970-01-01
    • 2018-04-10
    • 2016-08-21
    • 2012-12-20
    • 2020-08-06
    • 2014-06-06
    相关资源
    最近更新 更多