Menggunakan factory_girl dengan PaperClip 4.0

Adakah yang tahu cara yang tepat untuk membuat lampiran PaperClip 4.0 dengan factory_girl, melewati pemrosesan dan validasi PaperClip apa pun?

Saya dulu hanya bisa melakukan hal berikut di pabrik saya:

factory :attachment do
  supporting_documentation_file_name { 'test.pdf' }
  supporting_documentation_content_type { 'application/pdf' }
  supporting_documentation_file_size { 1024 }
  # ...
end

Ini pada dasarnya akan mengelabui PaperClip agar berpikir bahwa ada lampiran yang valid.

Setelah memutakhirkan dari 3.5.3 ke 4.0, sekarang saya mendapatkan kesalahan validasi:

ActiveRecord::RecordInvalid: Validation failed: Image translation missing: en.activerecord.errors.models.attachment.attributes.supporting_documentation.spoofed_media_type

CATATAN: Diskusi asli untuk PaperClip 3.X ada di sini: Bagaimana Saya Menggunakan Factory Girl Untuk Menghasilkan Lampiran Penjepit Kertas?


person steakchaser    schedule 03.02.2014    source sumber
comment
Masalah yang dibuka di repo Paperclip: github.com/thinkbot/paperclip/issues/1432   -  person steakchaser    schedule 07.02.2014


Jawaban (1)


Masalah ini tampaknya disebabkan oleh baris 61 di media_type_spoof_detector.

Penjepit Kertas sedang mencoba menemukan jenis mime dari "file" yang telah Anda unggah. Jika tidak ada, validasi gagal untuk melindungi Anda dari spoofing jenis file.

Saya sendiri belum mencobanya, tapi mungkin pilihan terbaik Anda adalah menggunakan file asli, dan mengaturnya menggunakan metode fixture_file_upload dari ActionDispatch::TestProcess.

factory :attachment do
   supporting_documentation { fixture_file_upload 'test.pdf', 'application/pdf' }

   # This is to prevent Errno::EMFILE: Too many open files
   after_create do |attachment, proxy|
     proxy.supporting_documentation.close
   end
end

Anda harus memasukkan ActionDispatch::TestProcess ke dalam test_helper.rb

Ini pertama kali diposting di sini.

person Hayden Ball    schedule 01.05.2014
comment
Hm, apakah pivotallabs.com/ masih berlaku? - person phillbaker; 10.05.2014
comment
Saya yakin ini adalah alasan kait after_create, yang menutup file temp dengan benar? Tapi aku mungkin salah... - person Hayden Ball; 11.05.2014
comment
Bisakah Anda menjelaskan cara kerja kait after_create? Saya kesulitan mewujudkannya. Apa yang seharusnya menjadi proxy? Saat saya menjalankan pengujian, proxy nihil. - person Daniel Bonnell; 29.05.2015
comment
after_create harus dijalankan setelah FactoryGirl membuat modelnya. Parameter kedua adalah objek yang digunakan FactoryGirl untuk membuat model. Lihat bagian has_many di rubydoc.info/gems/factory_girl/file/ untuk lebih jelasnya. - person Hayden Ball; 31.05.2015