paperclipでファイルアップロードをRspecでテスト w/ factory_girl

More than 3 years have passed since last update.

次ブログから要旨だけ抽出:http://konyu.hatenablog.com/entry/2015/05/05/155421


動作確認環境


  • OSX yosemite

  • Ruby2.2.0

  • Rails4.2

  • Rspec3.1


準備 設定ファイル修正rails_helper.rb

fixture_file_uploadを呼び出せるように、ラブラリを読み込むように追記

追記箇所は以下のようにRSpec.configureのブロック内に追記

RSpec.configure do |config|

...
..
# paperclip file uploadテスト用
# rspec内で、ファイルアップロードのテストに使用する
config.include ActionDispatch::TestProcess

# factoryGirl内での呼び出し
FactoryGirl::SyntaxRunner.class_eval do
include ActionDispatch::TestProcess
end

# fixtureのパス指定
# ファイルアップロードテストする際のアップするファイルを指定するパスをfixtures以下から省略して指定
config.fixture_path = "#{::Rails.root}/spec/fixtures"

end


ファイルアップロードのテスト


アップロード対象のファイルを置く

fixture_pathを通してある/spec/fixturesの下にアップロード対象のファイルを置く

今回の説明では/spec/fixtures/voice/voice01.mp3を設置する

※ ダミーのテキストファイルの拡張子を変えただけのファイルだと怒られる


アップロードするメソッドの呼び出し方

# 呼び出し方

fixture_file_upload("相対パスのファイル名", "mime_type"))
# mp3の場合
fixture_file_upload("voice/voice01.mp3", "audio/mp3"))


具体的なRspecコード例

describe "#update a and file upload" do

it "can upload with update_attributes" do
# sound モデルを更新してファイルをアップロードする
sound.update_attributes(voice: fixture_file_upload("voice/voice01.mp3", "audio/mp3"))
sound.reload
# paperclipで生成されたファイル名を格納したカラムに値が入っていることを確認
expect(sound.voice_file_name).not_to be_nil
end
end


Factory_girlのフィクスチャでファイルをアップロード済みのモデルと定義する場合


factory_girlの定義

factory :sound do

msg "original"
trait(:recorded) do
# factory_girlのファイルではfixture_pathを見てくれないので頭からパスを定義して上げる必要があった。
voice { fixture_file_upload("#{::Rails.root}/spec/fixtures/voice/voice01.mp3", "audio/mp3") }
end
end


specファイルで呼び出し例

let(:sound) { FactoryGirl.create(:sound, :recorded) }

ref:http://apidock.com/rails/ActionController/TestProcess/fixture_file_upload