我有一个方法帮助程序,它读取文件和目录并构建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上创建假文件然后测试方法。
有更简洁明智的方法来测试这种方法吗?感谢
答案 0 :(得分:2)
您遇到的困难是因为您的代码紧密耦合。相同的代码遍历目录结构并生成html。
理想情况下,您的代码应该分开,以便您拥有:
答案 1 :(得分:1)
这是更优雅的方式。假文件系统 - fakefs
答案 2 :(得分:0)
我的建议是存根和嘲笑内部事物的行为:像
这样的东西Dir.stub(:new).with(path).and_return([list of File mocks?])
通过这种方式,您可以确保只测试代码而不是您正在使用的各种ruby库中的代码。
我发现自己这样做是基于基于http的行为。如果我正在使用ruby http库,我不仅不想浪费时间测试这些东西,而且实际启动http请求并等待响应的代价很高。将这些东西记录下来可以让我测试我的代码对某些响应类型的反应。
我认为这完全是隔离。