Saya memiliki model Person yang memiliki banyak Gambar, di mana gambar memiliki bidang lampiran Penjepit Kertas yang disebut data, versi singkatnya ditampilkan di bawah ini:
class Person
has_many :images
...
end
class Image
has_attached_file :data
belongs_to :person
...
end
Orang harus memiliki setidaknya satu Gambar yang dilampirkan.
Saat menggunakan FactoryGirl, saya memiliki kode yang mirip dengan berikut ini:
Factory.define :image do |a|
a.data { File.new(File.join(Rails.root, 'features', 'support', 'file.png')) }
a.association :person
end
Factory.define :person do |p|
p.first_name 'Keyzer'
p.last_name 'Soze'
p.after_create do |person|
person.assets = [Factory.build(:image, :person => person)]
end
# p.images {|images| [images.association(:image)]}
end
(NB Saya juga mencoba kode yang dikomentari di atas juga mencoba) Sebagian besar waktu ketika saya menjalankan fitur mentimun, saya mendapatkan kesalahan seperti berikut:
Tidak ada file atau direktori seperti itu - /tmp/stream,9887,0.png (Errno :: ENOENT)
...
Terkadang tes berjalan dengan sukses.
Adakah yang bisa memberi tahu saya apa masalah yang saya alami di sini atau bagaimana mereka menggunakan FactoryGirl dan Paperclip bersama-sama untuk mencapai sesuatu seperti yang saya coba capai?
Saya menggunakan Rails 3.
Jawaban:
Anda dapat menggunakan fixture_file_upload
include ActionDispatch::TestProcess
di test helper Anda, berikut adalah contoh pabrik:Dalam contoh di atas,
spec/photos/test.png
harus ada di direktori root aplikasi Anda sebelum menjalankan pengujian.Perhatikan, itu
FactoryBot
adalah nama baru untukFactoryGirl
.sumber
{ }
wajib diisi. Rusak tanpanyainclude ActionDispatch::TestProcess
harus dimasukkan di bagian paling atas dari file pabrik, di luar ituFactoryGirl.define do...end
blok.Sintaks FG yang lebih baru dan tidak perlu menyertakan
atau, lebih baik lagi,
sumber
Desmond Bowe di Pivotal Labs menyarankan untuk menghindari fixture_file_upload karena masalah kebocoran memori. Sebaliknya, Anda harus menyetel bidang penjepit kertas langsung di pabrik Anda:
sumber
content_type
. Untuk itu Anda membutuhkan objek file yang valid.Saya telah menggunakan kode dalam inti di bawah ini:
Rel 2
http://gist.github.com/162881
Rel 3
https://gist.github.com/313121
sumber
sumber
Coba gunakan ActionController :: TestUploadedFile. Anda cukup menyetel properti file ke instance TestUploadedFile dan paperclip akan menangani sisanya. Sebagai contoh
sumber
Jawaban di atas dalam beberapa kasus dapat membantu, dan yang benar-benar membantu dalam salah satu situasi saya, tetapi saat menggunakan gelombang pembawa, solusi sebelumnya dari pertanyaan ini tidak berhasil kali ini.
PENDEKATAN PERTAMA:
Bagi saya menambahkan
after :create
memecahkan masalah untuk saya seperti ini:Mengatur file video sebaris seperti
video_file { File.new("#{Rails.root}/spec/fixtures/sample.mp4") }
tidak berhasil dan melaporkan kesalahan.PENDEKATAN KEDUA:
Tentukan pabrik seperti ini (ubah
personal_file
ke nama lampiran Anda):Dan tambahkan baris ini ke
config/environemnts/test.rb
:sumber
Apa yang sebenarnya Anda uji? Penjepit kertas itu akan berhasil melampirkan file? Itu benar-benar tampak seperti ujian yang harus ditangani penjepit kertas, bukan aplikasi Anda.
Sudahkah kamu mencoba
Kami menggunakan Machinist daripada factory_girl dan baru saja menggunakan hal-hal seperti
Padahal, kami tidak benar-benar menguji banyak ketika kami melakukan ini, kami biasanya hanya ingin memiliki
Image
objek yang valid .sumber