【ruby】Railsでファイルアップロードをテストする
Rack::Test::UploadedFileを使用します。
http://rdoc.info/github/brynary/rack-test/master/Rack/Test/UploadedFile
インスタンスを生成する際に、第一引数にファイルのパス、第二引数にcontent-typeを指定します。
Rack::Test::UploadedFile.new("/path/to/sample.jpg", "image/jpeg")
ファイルをmultipart/form-dataなどでリクエストするAPIなどのテストは、このUploadedFileのインスタンスを渡してあげれば、ファイルアップロードのテストができます。
例えばこんな感じ。
post :photos, file: Rack::Test::UploadedFile.new("/path/to/sample.jpg", "image/jpeg")
ちなみに、このRack::Test::UploadedFileのインスタンスを生成するためのメソッドも用意されています。
fixture_file_uploadです。
http://apidock.com/rails/ActionController/TestProcess/fixture_file_upload
fixture_file_upload('/path/to/sample.jpg', 'image/jpeg')
fixture_file_uploadは呼び出し元のクラスがfixture_pathを持っていた場合は、fixtureディレクトリまでのパスを勝手に追加してくれます。
fixture_file_upload('/files/sample.jpg', 'image/jpeg') # /rails_root/spec/fixtures/files/sample.jpg
factory_girlの中でfixture_file_uploadを呼び出しても、fixtureディレクトリが勝手に追加されないのは、fixture_pathを持っていなかったからなのね。
ちなみに、fixture_file_uploadはActionDispatch::TestProcessがincludeされていないと実行できないので注意が必要です。
include ActionDispatch::TestProcess