0
1

RSPecでCSVファイルを検証する

Last updated at Posted at 2023-10-15

背景+まとめ

CSVデータを使って、データ登録・更新を行う機能をRSpecでテストする場合にちょっと工夫が必要だった箇所をメモしてます。
例えば、CSVデータの値で更新されているか?をチェックする場合、更新後のデータの比較にCSVデータ自体を用いることで後の変更が容易な記述にすることができます。

CSV.table

CSV.tableが使いやすくて便利だった。

users.csv
code,email,gender,status
"001",test@example.com,1,1
"002",test2@example.com,1,2
file_path = "users.csv"
users_csv_table = CSV.table(file_path)


# 配列で出力
users_csv_table.to_a
=> [[:code, :email, :gender, :status], [1, "test@example.com", 1, 1], [2, "test2@example.com", 1, 2]]

# headerのみ出力
users_csv_table.headers
=> [:code, :email, :gender, :status]

# [:ヘッダー名]で指定したヘッダーの値を出力
users_csv_table[:code]
=> [1, 2]

参考:class CSV::Table

CSVデータの自動判別

file_path = "users.csv"
CSV.table(file_path, converters: nil)

csvの中で"001"などの値があると、CSV.tableの機能でデータ型を自動判別されてしまい、intの1になります。
この対策として、converters: nilを指定します。
そうすることで、データ型の自動判別を無効にすることができます。

enumのテスト

例えば、Userのgender属性がenumで定義されているとしましょう。

# User側で以下のように定義されている
# enum gender: { unknown: 0, male: 1, female: 2 }

# user.genderを呼び出すと、id: 1のUserのgenderが1の場合、以下のように出力される。
user = User.find(1)
user.gender
=> male

# _before_type_castをカラム名に付け加えることで数値として出力してくれる。
user.gender_before_type_cast
=> 1

参考:【Rails】Enumを使いこなそう

0
1
0

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
0
1