在 Ruby Test::Unit 中存根 CSV 文件

Stub a CSV file in Ruby Test::Unit

所以我有一个 Ruby 脚本,它将 CSV 文件解析为规则列表并进行一些处理,returns 将哈希数组作为已处理数据。

CSV 看起来像这样:

id_number,rule,notes
1,"dummy_rule","necessary"
2,"sample_rule","optional"

CSV 的解析如下所示:

def parse_csv(file_name)
  filtered_data = []
  CSV.foreach(file_name, headers: true) do |row|
    filtered_data << row # some processing
  end
  filtered_data
end

现在我想知道是否可以 stub/mock 一个用于单元测试的实际 CSV 文件,以便我可以将 "filename" 传递给此函数。我可以制作一个 CSV 对象并使用生成函数,但实际的文件名将不可能。

def test_parse_csv
   expected_result = ["id_number"=>1, "rule"=>"dummy_rule", "notes"=>"optional"}]
   # stub/mock csv with filename: say "rules.csv"
   assert.equal(expected_result, parse_csv(file_name))
end

我用Test::Ruby

我还找到了一个名为 mocha 的 ruby gem 库,但我不知道它如何用于 CSVs

https://github.com/freerange/mocha

欢迎任何想法!

我会在您的测试目录中创建一个支持目录,然后创建一个文件..

# test/support/rules.csv
id_number,rule,notes
1,"dummy_rule","necessary"
2,"sample_rule","optional"

您的测试应该如下所示,还添加了一个左大括号,看起来您在第 2 行中错过了。

def test_parse_csv
   expected_result = [{"id_number"=>1, "rule"=>"dummy_rule", "notes"=>"optional"}]
   assert.equal(expected_result, parse_csv(File.read(csv_file)).first)
end

def csv_file
  Rails.root.join('test', 'support', 'rules.csv') 
end

编辑:抱歉,我应该注意到这不是 Rails 上的 Ruby...这是一个 ruby 解决方案:

def test_parse_csv
   expected_result = [{"id_number"=>1, "rule"=>"dummy_rule", "notes"=>"optional"}]
   assert.equal(expected_result, parse_csv(csv_file).first)
end

def csv_file
  File.read('test/support/rules.csv') 
end

我在测试中这样做 let(:raw_csv) { "row_number \n 1 \n 2" },告诉自己 CSV 文件肯定被读取为带有换行符和逗号的简单字符串...而且它工作正常。小心额外的空格和逗号,很容易出错。