背景
rspecでcsvファイルアップロード機能をテストすることがあった
絶対忘れるから残しておく
やったこと
CSVアップロード機能(controller)
こんな感じのcsvアップロード機能をテストしたい
params[:csv_file]
は画面のフォームで指定したcsvファイル
csv_upload_controller.rb
def create
CSV.foreach(params[:csv_file].path, headers: true, encoding: 'SJIS') do |row|
# 読み込み処理
end
respond_to do |format|
format.html { render :index }
end
end
テストコード(specファイル)
controllerのspecファイルは以下の通り
csv_upload_controller_spec.rb
describe 'POST #create' do
# spec/fixtures/配下のテスト用csvファイルを指定
# パスはfixturesからのパスでOK
let(:csv_file) { 'test.csv' }
it 'success' do
post :create, params: {
# let()で指定した変数を指定
csv_file: fixture_file_upload(csv_file, 'text/csv')
}
# 今回はとりあえずレスポンスが正常だけ確認
expect(response).to be_successful
end
end
- テスト用のcsvファイルを
spec/fixtures/
配下に格納する -
let(:csv_file) { 'test.csv' }
でcsvファイルを指定する(ディレクトリを作成した場合は{ 'user/test.csv' }
のようにfixturesからのパスを記載する) - paramsで
fixture_file_upload(csv_file, 'text/csv')
と書くことで指定したcsvファイルをパラメータに設定することができる
気をつけること
個人的な内容ですが・・・
- ファイル名はテスト内容がわかるようにする
- 無駄なファイルを大量生産しない(整理整頓)
- エラーパターンのファイルも作る
- 用途が異なる場合(controllerが異なるとか)の場合はディレクトリを作成して分類分けする
最後に
ファイルアップロード機能ってよくあるし、すごーく初歩的なことですが、結構覚えてないもんです
「テストファイル作るのかよ。めんどくさい!」と思わず、簡単に作れるよう工夫しましょー!