Di aplikasi django saya, saya memiliki tampilan yang menyelesaikan pengunggahan file. Potongan intinya seperti ini
...
if (request.method == 'POST'):
if request.FILES.has_key('file'):
file = request.FILES['file']
with open(settings.destfolder+'/%s' % file.name, 'wb+') as dest:
for chunk in file.chunks():
dest.write(chunk)
Saya ingin menguji tampilan unit. Saya berencana untuk menguji jalur bahagia serta jalur gagal .. yaitu, kasus di mana request.FILES
tidak memiliki 'file' kunci, kasus di mana request.FILES['file']
memiliki None
..
Bagaimana cara mengatur data kiriman untuk jalur bahagia? Adakah yang bisa memberi tahu saya?
django
unit-testing
file-upload
Damon
sumber
sumber
Jawaban:
Dari dokumen Django di
Client.post
:sumber
integration test
- tidak benar-benar masalah sampai Anda masuk ke basis kode yang lebih kompleks bahkan mungkin dengan tim penguji yang sebenarnyaSaya biasa melakukan hal yang sama
with open('some_file.txt') as fp:
tetapi kemudian saya membutuhkan gambar, video dan file nyata lainnya di repo dan juga saya sedang menguji bagian dari komponen inti Django yang telah diuji dengan baik, jadi saat ini inilah yang telah saya lakukan:Di Python 3.5+ Anda perlu menggunakan
bytes
objek, bukanstr
. Ganti"file_content"
keb"file_content"
Ini berfungsi dengan baik,
SimpleUploadedFile
membuatInMemoryFile
yang berperilaku seperti upload biasa dan Anda dapat memilih nama, konten dan jenis konten.sumber
"file_content"
harus berupa header gambar yang valid sehingga kode Anda menganggapnya sebagai gambar yang valid.Saya merekomendasikan Anda untuk melihat Django RequestFactory . Ini adalah cara terbaik untuk memalsukan data yang diberikan dalam permintaan.
Mengatakan bahwa, saya menemukan beberapa kekurangan dalam kode Anda.
Jadi, saya menyarankan Anda untuk memfaktorkan ulang pandangan Anda untuk menggunakan fungsi seperti:
Dan lakukan beberapa ejekan tentang itu. Anda dapat menggunakan Python Mock .
PS: Anda juga dapat menggunakan Django Test Client Tetapi itu berarti bahwa Anda menambahkan hal lain lagi untuk diuji, karena klien tersebut menggunakan Sesi, middlewares, dll. Tidak ada yang mirip dengan Pengujian Unit.
sumber
profile_picture
yang secara internal menggunakanupload_profile_picture
fungsi. Jika Anda ingin menguji tampilan tersebut, cukup tiru fungsi internal dan pastikan itu dipanggil pada pengujian Anda. Ini adalah contoh sederhana: gist.github.com/santiagobasulto/6437356Saya melakukan sesuatu seperti ini untuk aplikasi terkait acara saya sendiri, tetapi Anda harus memiliki lebih dari cukup kode untuk melanjutkan kasus penggunaan Anda sendiri
sumber
Saya melakukan sesuatu seperti itu:
Fungsi create_image akan membuat gambar sehingga Anda tidak perlu memberikan jalur statis gambar.
Catatan: Anda dapat memperbarui kode sesuai kode Anda. Kode ini untuk Python 3.6.
sumber
Dalam Django 1.7 ada masalah dengan TestCase yang dapat diselesaikan dengan menggunakan open (filepath, 'rb') tetapi ketika menggunakan klien percobaan kami tidak memiliki kendali atasnya. Saya pikir mungkin yang terbaik adalah memastikan file.read () selalu mengembalikan byte.
sumber: https://code.djangoproject.com/ticket/23912 , oleh KevinEtienne
Tanpa opsi rb, TypeError dimunculkan:
sumber
sumber
Seperti disebutkan dalam dokumentasi resmi Django :
Informasi Lebih Lanjut: Bagaimana cara memeriksa apakah file dilewatkan sebagai argumen ke beberapa fungsi?
Saat menguji, terkadang kami ingin memastikan bahwa file tersebut diteruskan sebagai argumen ke beberapa fungsi.
misalnya
Dalam pengujian, gunakan tiruan Python seperti ini:
sumber
Semoga ini membantu.
sumber
Saya menggunakan Python == 3.8.2, Django == 3.0.4, djangorestframework == 3.11.0
Saya mencoba
self.client.post
tetapi mendapatResolver404
pengecualian.Berikut ini berhasil untuk saya:
sumber