はじめに
新卒エンジニアの@yhorikawaです
csvをアップロードする機能を作っていたのですが、テストの方法がわからず苦戦したので
今後ファイルアップロード機能をテストしたいときのために備忘録として残します。
controller
csv_upload.rb
def csv_upload
# csv読み込み部分
csv = CSV.read(params[:csv])
# このあと保存処理
end
このような形のcontrollerにparams[:csv]といった形でcsvを渡します。
テストコード
csv_upload_request_spec.rb
describe 'post #csv_upload' do
let(:params) { { csv: fixture_file_upload('csv_file_path', 'text/csv') } }
subject { post 'csv_upload', params }
it 'upload_csv' do
expect(subject).to be_success
end
end
csvファイルをspec/fixtures/
などに保存して
fixture_file_upload('csv_file_path', 'text/csv')
にcsvファイルの相対パスを書くことで
ファイルをパラメーターとして渡すことができます
おわりに
fixture_file_upload
を使うことで比較的簡単に実装することができました。
csvに限らずファイルのアップロード機能をテストしたいことはあると思うので記事を書きました。