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

时间:2017-04-24 11:32:50

标签: ruby unit-testing csv testunit

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

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

现在我想知道是否可以以这样的方式存根/模拟实际的CSV文件进行单元测试,以便我可以将“文件名”传递给此函数。我可以创建一个CSV对象并使用generate函数,但实际的文件名是不可能的。

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库,但我不知道这对CSV有什么作用

https://github.com/freerange/mocha

欢迎任何想法!

2 个答案:

答案 0 :(得分:1)

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

# 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

编辑:对不起,我应该注意到这不是Ruby on Rails ...这是一个红宝石解决方案:

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

答案 1 :(得分:0)

我在测试let(:raw_csv) { "row_number \n 1 \n 2" }中做到了这一点,告诉我自己CSV文件肯定是作为带有换行符和逗号的简单字符串读取的,并且效果很好。请注意其他空格和逗号,这很容易出错。