LoginSignup
7
6

More than 5 years have passed since last update.

FactoryGirlのファイルアップロードを速くする

Posted at

FactoryGirl + Paperclip(たぶんCarrierWaveも同じ)で画像などのファイルデータを作成したいニーズは結構あります。バリデーションの都合とかで。そんなにデータがないのであれば下記のように fixture_file_upload 書けばOKと思います。

FactoryGirl.define do

  factory :image, class: Image do
    file { fixture_file_upload("spec/file/dummy.jpg", "image/jpeg") }
  end

end

しかし、僕の環境だと一定の数のテストデータを作成するとRSpecが応答不能になるという事態に遭遇しました。今回のテストだと、実際のファイル自体にたいしてテストするということはなかったので、下記のように単純にDBフィールドに適当なデータを突っ込むことで高速化できました。

FactoryGirl.define do

  factory :image do
    file_file_name "dummy.jpg"
    file_content_type "image/jpeg"
    file_file_size "1024"
    file_updated_at "2017-01-01"
  end

end

試しにベンチマークも取ってみました。 fixture_file_upload 以外にも単純に File.open するタイプも付け足しています。

spec/factories/images.rb

FactoryGirl.define do

  factory :image_fixture, class: Image do
    file { fixture_file_upload("spec/file/dummy.jpg", "image/jpeg") }
  end

  factory :image_file, class: Image do
    file { File.open("spec/file/dummy.jpg") }
  end

  factory :image_field, class: Image do
    file_file_name "dummy.jpg"
    file_content_type "image/jpeg"
    file_file_size "1024"
    file_updated_at "2017-01-01"
  end

end

bm.rb

Benchmark.bm 10 do |r|
  r.report "fixture" do
    DatabaseCleaner.start
    5.times do
      FactoryGirl.create(:image_fixture)
    end
    DatabaseCleaner.clean
  end

  r.report "file" do
    DatabaseCleaner.start
    5.times do
      FactoryGirl.create(:image_file)
    end
    DatabaseCleaner.clean
  end

  r.report "field" do
    DatabaseCleaner.start
    5.times do
      FactoryGirl.create(:image_field)
    end
    DatabaseCleaner.clean
  end
end

結果

$ RAILS_ENV=test rails runner bm.rb

                 user     system      total        real
fixture      0.130000   0.050000   0.660000 (  0.888103)
file         0.260000   0.120000   0.840000 (  1.118591)
field        0.050000   0.010000   0.060000 (  0.075582)

当然ですがファイルを何もいじらないフィールドを埋めるのが一番高速ですね。

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6