【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