背景+まとめ
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]
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