如何测试目录?

时间:2011-09-20 11:13:36

标签: ruby-on-rails testing tdd

我有一个方法帮助程序,它读取文件和目录并构建html视图。像这样:

def build_segment(path)
    html = ""
    Dir.new(path).each do |f|
      next if f == "." or f == ".."
      html << "<li>"
      if File.ftype(f) == 'directory'
        html << "<span class=folder>#{h(f.to_s)}</span>"
        html << "<ul>"
        html << build_segment(Dir.new(f))
        html << "</ul>"
      elsif File.ftype(f) == 'file'
        html << "<span class=file>#{h(f.to_s)} </span>"
      end
      html << "</li>"
    end
    html
  end

通常测试我们使用模拟对象的一些方法 - 将假对象发送到测试方法。 但这是真正的文件系统。我只能发明一个变体 - 在OS上创建假文件然后测试方法。

有更简洁明智的方法来测试这种方法吗?感谢

3 个答案:

答案 0 :(得分:2)

您遇到的困难是因为您的代码紧密耦合。相同的代码遍历目录结构并生成html。

理想情况下,您的代码应该分开,以便您拥有:

  1. 从给定目录结构构建数据结构的目录解析器;然后
  2. 用于构建html的渲染器

答案 1 :(得分:1)

这是更优雅的方式。假文件系统 - fakefs

答案 2 :(得分:0)

我的建议是存根和嘲笑内部事物的行为:像

这样的东西
Dir.stub(:new).with(path).and_return([list of File mocks?])

通过这种方式,您可以确保只测试代码而不是您正在使用的各种ruby库中的代码。

我发现自己这样做是基于基于http的行为。如果我正在使用ruby http库,我不仅不想浪费时间测试这些东西,而且实际启动http请求并等待响应的代价很高。将这些东西记录下来可以让我测试我的代码对某些响应类型的反应。

我认为这完全是隔离。