今参画しているプロジェクトでCSVのRSpecは
expect(csv).to have_content('value')
のような形で書いていたのですが行毎の値を確認する必要が出てきたのでいろいろ調べていたんですが地味に検索で出てこなかったのでメモ。
以下のようなcsvを想定
column_0 | column_1 |
---|---|
value_1 | value_2 |
value_3 | value_4 |
it 'example' do
csv_content = Sample.csv_content
csv = CSV.parse(csv_content)
# [行番号][列番号]
expect(csv[0][0]).to eq 'value_1'
expect(csv[0][1]).to eq 'value_2'
expect(csv[1][0]).to eq 'value_3'
expect(csv[1][1]).to eq 'value_4'
# 行毎に比較もできる
expect(csv[0]).to eq ['value_1', 'value_2']
expect(csv[1]).to eq ['value_3', 'value_4']
end
これでテストが捗ります。
追記
コメントでCSV.table
なるものを教えて頂きました!
it 'example' do
csv_content_path = Sample.csv_content.path
table = CSV.table(csv_content_path) # Pathを渡す
table.headers # => [:column_0, :column_1]
# [ヘッダー名][行番号]
expect(table[:column_0][0]).to eq 'value_1'
expect(table[:column_0][1]).to eq 'value_2'
expect(table[:column_1][0]).to eq 'value_3'
expect(table[:column_1][1]).to eq 'value_4'
# 行毎の取得
expect(table[0]).to eq ['value_1', 'value_2']
expect(table[1]).to eq ['value_3', 'value_4']
# 列毎の取得
expect(table[:column_0]).to eq ['value_1', 'value_3']
expect(table[:column_1]).to eq ['value_2', 'value_4']
end
実装中ならこっちの方が使いやすいかもですね。
列毎にまとめて取得できるのもかなり使い所ありそうです。
ただ、CSV.tableはファイルのPathを渡す必要があるのでそこだけ注意ですね。
参考リンク
https://qiita.com/gotchane/items/e615fed15901aed6c18a
https://melborne.github.io/2013/01/24/csv-table-method-is-awesome/
https://docs.ruby-lang.org/ja/latest/class/CSV=3a=3aTable.html