10
4

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 5 years have passed since last update.

Rspecでcsvアップロード機能のテストをする

Posted at

背景

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
  1. テスト用のcsvファイルをspec/fixtures/配下に格納する
  2. let(:csv_file) { 'test.csv' }でcsvファイルを指定する(ディレクトリを作成した場合は{ 'user/test.csv' }のようにfixturesからのパスを記載する)
  3. paramsでfixture_file_upload(csv_file, 'text/csv')と書くことで指定したcsvファイルをパラメータに設定することができる

気をつけること

個人的な内容ですが・・・

  • ファイル名はテスト内容がわかるようにする
  • 無駄なファイルを大量生産しない(整理整頓)
  • エラーパターンのファイルも作る
  • 用途が異なる場合(controllerが異なるとか)の場合はディレクトリを作成して分類分けする

最後に

ファイルアップロード機能ってよくあるし、すごーく初歩的なことですが、結構覚えてないもんです
「テストファイル作るのかよ。めんどくさい!」と思わず、簡単に作れるよう工夫しましょー!

10
4
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
10
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?