ハイパーニートプログラマーへの道

頑張ったり頑張らなかったり

【Rails】ファイルアップロードのテスト時のFactoryGirl (FactoryBot) の設定

このようにしていまして

FactoryGirl.define do
  # 中略
  factory :content_figure do
      content do
        ActionDispatch::Http::UploadedFile.new(
          filename: 'figure.png',
          type: 'image/png',
          tempfile: File.open(Rails.root.join('spec', 'files', 'figure.png'))
        )
      end
    end
  end
end

こんな感じで ActionDispatch::Http:UploadedFile.new するのもいいんですが、 fixture_upload_path を使うのもアリかと

include ActionDispatch::TestProcess

FactoryGirl.define do
  factory :content_figure do
      content { fixture_file_upload(Rails.root.join('spec', 'files', 'figure.png'), 'png'), 'image/png' }
  end
end

しかしActionDispatch::TestProcess をインクルードするのを忘れると困ります
この記事のコメントによるとfixture_file_upload はほとんど何もやっていないそうなので、Rack::Test::UploadedFile.newを直接呼んでしまってもいいらしい

content { Rack::Test::UploadedFile.new(Rails.root.join('spec', 'files', 'figure.png'), 'png'), 'image/png' }

fixture_file_upload は呼び出し元のクラスがfixture_path を持っていれば自動的にspec/fixtures までのパスを追加してくれますが、 FactoryGirl からでは参照してくれないので、別途fixture_path の設定が必要になります

今回はspec/files 配下にイメージを置いてしまっていますし、別途fixture_path を設定するのも面倒なので、このように直接パス指定する形でいいかと

tanihiro.hatenablog.com

qiita.com

こちらの記事のコメントでは、FactoryGirl からパスを参照させるためにfixture_path を設定していたり

qiita.com