4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

RSpecでCSVの値をチェックする

Last updated at Posted at 2020-08-25

今参画しているプロジェクトで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

4
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?