Help us understand the problem. What is going on with this article?

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

kon_yu
道産子プログラマ
http://konyu.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away