1

我正在尝试使用Dir[]和/或使用以下内容来全局目录Dir.foreach

files = Dir["#{options[:dir]}/**/*"].reject { |file| File.directory?(file) }
puts files.map{|filename| filename.join("\n")

和:

def print_tree(dir = ".", nesting = 0)
  Dir.foreach(dir) do |entry|
    next if entry =~ /^\.{1,2}/ # Ignore ".", "..", or hidden files
    puts "| " * nesting + "|-- #{entry}"
    if File.stat(d = "#{dir}#{File::SEPARATOR}#{entry}").directory?
      print_tree(d, nesting + 1)
    end
  end
end

我正在尝试用Cucumber 和 Aruba对此进行测试。这是我的内容listing_files.feature

When I run `poet ls`
Then the output should contain exactly:
"""
foo/bar/conf1
foo/conf2.disabled

"""

和:

Then the output should contain exactly:
"""
|-- foo
| |-- bar
| | |-- conf1
| |-- conf2.disabled

"""

在我的本地机器上进行测试(OSX)很好,但我在 Travis 上遇到了这个失败:

expected: "foo/bar/conf1\nfoo/conf2.disabled\n"
got: "foo/conf2.disabled\nfoo/bar/conf1\n" (using ==)

显然,返回结果的顺序在所有系统上都不相同。这是1.9.3 和 2.0的记录行为:

请注意,区分大小写取决于您的系统(因此忽略 File::FNM_CASEFOLD),返回结果的顺序也是如此。

这使得测试目录列表成为一场噩梦。我可以以某种方式强制命令吗?或者如果没有,是否有最佳实践来综合测试这样的事情?

4

2 回答 2

3

Dir[]您总是可以在返回之前对调用结果进行排序:

def print_tree(dir = ".", nesting = 0)
  Dir.entries(dir).sort.each do |entry|
    # the rest is the same...
  end
end

或者,如果您有两个目录列表数组,请先在测试中对它们进行排序,然后再进行比较。

此外,如果您使用的是 RSpec,您可以通过使用=~运算符获得数组内容而不是 order/contents:

arr1 = Dir['*.whatever']
arr2 = some_method_that_gets_the_dir_listing()
arr2.should =~ arr1

在 Test::Unit 中,同样可以使用assert_same_elements

于 2013-04-10T20:11:01.737 回答
0

如果您不关心顺序,您可以随时使用include带有 splat 的匹配器来解压您的数组

[1,2,3,4,5].should include(*[5,2,4,1,3])
于 2013-04-10T20:18:51.390 回答