【问题标题】:How to assert a CSV file in Ruby如何在 Ruby 中断言 CSV 文件
【发布时间】:2014-08-29 10:41:30
【问题描述】:

有没有一种好方法可以在 Ruby 中断言 CSV 文件的内容?

我了解如何使用 CSV 库以及如何读取 CSV 文件,但这会导致一长串断言,例如:

`assert_equal("0", @csv_array[0].field('impressions'))
 assert_equal("7", @csv_array[0].field('clicks'))
 assert_equal("330", @csv_array[0].field('currency.GBP.commissions'))
 assert_equal("6", @csv_array[0].field('currency.GBP.conversions'))
 assert_equal("3300", @csv_array[0].field('currency.GBP.ordervalue'))`

是否有某种文件比较器,所以我可以写:

assert_equal(expected.csv ,actual.csv )

或者类似的东西?

【问题讨论】:

  • 为什么不对两者运行 MD5 检查并比较这些值?如果您使用的是 *nix 或 Mac OS,请参阅 man md5

标签: ruby csv minitest testunit


【解决方案1】:

这个怎么样:

expected_csv = "impressions,clicks,currency.GBP.comiisions,currency.GBP.conversions,currency.GBP.ordervalue
0,7,330,6,3300"
actual_csv = File.open('actual.csv').read
assert_equal(expected_csv, actual_csv)

如果 CSV 文件的全部内容只有 2 行,这应该可以工作。否则你将不得不操纵actual_csv 来获得你想要测试的部分。你可以这样做:

IO.readlines('actual.csv')[3]

这将为您提供第三行。然后,您可以与标题行连接或与没有标题的字符串进行比较。

【讨论】:

  • 谢谢,它有很多行,所以选择了第二个可行的解决方案
【解决方案2】:

如果您必须测试非常多的输出,您可能会发现approval testing 是一种有趣的方法。基本上,第一次运行测试时会保存输出。然后,您可以手动检查输出并在正确时批准它。在随后的运行中,当输出不同时会出现错误。

【讨论】:

    【解决方案3】:

    我为此创建了一个快速而肮脏的方法,我可能会在某个时候清理并变成宝石。 https://gist.github.com/bpardee/513b4a15e5ebdc596e0b

    比如下面的代码:

    file = 'test.csv'
    File.open(file, 'w') do |fout|
      fout.puts "foo,bar,zulu\n1,2,3\n4,5,6"
    end
    assert_csv(file) do |csv|
      csv << %w(foo bar warrior)
      csv << [1,3,5]
      csv << [4,5,6]
    end
    

    会导致:

    Missing columns: ["zulu"]
    Unexpected columns: ["warrior"]
    The following mismatches were found in line 2:
      bar actual=3 expected=2
    

    我不建议将这用于大型 csv 文件,因为所有内容都会加载到内存中。

    【讨论】:

      猜你喜欢
      • 2020-01-08
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 2014-06-14
      • 1970-01-01
      • 2015-04-27
      • 2020-08-30
      • 1970-01-01
      相关资源
      最近更新 更多