9
11

More than 5 years have passed since last update.

CarrierWaveでファイルのアップロードをテストしたいときは

Last updated at Posted at 2016-02-14

今北産業

ここにあるようにfixture_file_upload railsを使うと良い。

このやり方は効果がない

・Paramにファイルパスをじかに渡すとCarrierWaveが

You tried to assign a String or a Pathname to an uploader, for security reasons, this is not allowed.

と出て受け取ってくれない

経緯

CSVファイルをアップロードして、その内容をDBに登録し、データに操作をくわえて、CSVファイルを吐き出す。という業務用のCSV編集アプリをRailsでつくろうとしてました。

CarrierWaveをいれて、CSVをアップロードしてやるためにコントローラーをつくりました。

   def import
    @uploaded_file = CsvUploader.new
    @uploaded_file.store!(params[:file])
    file_path = @uploaded_file.file.file
   end

こんな感じでファイルを受け入れてやって、アップロードされたファイルのパスを手に入れた後は、DBに登録させる・・・・というふうにしました。手動でやるとうまく動いてるようなのでRspecでテストを書きました。(本来テストは先に書くべきです。ただ、どう動くのかわからない状況だったため、結果を記録する意図でテストを書きます。)

post :import, params      expect(CsvData.all.count).to eq(100)

paramsに直接ファイルパスを文字列で渡したところ

 You tried to assign a String or a Pathname to an uploader, for security reasons, this is not allowed.

おやおやエラーが・・・じゃあ・・・stackoverflowをみて

csv_src = File.join(Rails.root, "/public/csv/test.csv")
csv_file = File.new(csv_src)

とやって文字列の代わりに渡してあげました。そしたら・・・

file_path = @uploaded_file.file.file

この箇所でNoMethodエラーが出るんですね。Pryで手動の実行結果と、テスト時の実行結果を比較してみると 
@uploaded_file
内のオブジェクトが違います。どうも正確にアップロードできてないみたいです。

で、ここにあるようなやり方をしてみたところうまく行きました。

ハマってる方は御参考に。

しかしなんで動かなかったんでしょうね。
fixture_file_upload rails ってCarrierWaveのメソッドなんでしょうか?

9
11
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
9
11