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)
当然ですがファイルを何もいじらないフィールドを埋めるのが一番高速ですね。