Saya mencoba menggunakan paket Python mock untuk mengejek requests
modul Python . Apa saja panggilan dasar untuk membuat saya bekerja dalam skenario di bawah ini?
Dalam views.py saya, saya memiliki fungsi yang membuat berbagai permintaan. Get () panggilan dengan respons berbeda setiap kali
def myview(request):
res1 = requests.get('aurl')
res2 = request.get('burl')
res3 = request.get('curl')
Di kelas pengujian saya, saya ingin melakukan sesuatu seperti ini tetapi tidak dapat menemukan panggilan metode yang tepat
Langkah 1:
# Mock the requests module
# when mockedRequests.get('aurl') is called then return 'a response'
# when mockedRequests.get('burl') is called then return 'b response'
# when mockedRequests.get('curl') is called then return 'c response'
Langkah 2:
Panggil pandanganku
Langkah 3:
verifikasi respons mengandung 'respons', 'respons b', 'respons c'
Bagaimana saya bisa menyelesaikan Langkah 1 (mengejek modul permintaan)?
Jawaban:
Ini adalah bagaimana Anda dapat melakukannya (Anda dapat menjalankan file ini apa adanya):
Catatan Penting: Jika
MyGreatClass
kelas Anda hidup dalam paket yang berbeda, katakanlahmy.great.package
, Anda harus mengejek,my.great.package.requests.get
bukan hanya 'request.get'. Dalam hal ini, ujian Anda akan terlihat seperti ini:Nikmati!
sumber
from unittest import mock
denganimport mock
dan sisanya berfungsi sebagaimana mestinya. Anda perlu menginstalmock
paket secara terpisah.mock_requests_get
kebutuhanyield
alih-alihreturn
karena perubahan untuk mengembalikan iterator dengan Python 3.Coba gunakan perpustakaan tanggapan :
memberikan kenyamanan yang cukup baik atas pengaturan semua mengejek diri sendiri
Ada juga HTTPretty :
Ini tidak spesifik untuk
requests
perpustakaan, lebih kuat dalam beberapa hal meskipun saya menemukan itu tidak cocok untuk memeriksa permintaan yang disadap, yangresponses
tidak cukup mudahAda juga httmock .
sumber
responses
mencocokkan url wildcard - yaitu, menerapkan logika panggil balik seperti "ambil bagian terakhir dari url, cari di Peta, dan kembalikan nilai yang sesuai". Apakah itu mungkin, dan saya hanya melewatkannya?request
argumen diterima oleh fungsi panggilan balik)Inilah yang bekerja untuk saya:
sumber
from unittest import mock
. docs.python.org/3/library/unittest.mock.htmlSaya menggunakan permintaan-mock untuk menulis tes untuk modul terpisah:
Dan tesnya:
sumber
ini adalah bagaimana Anda mengejek requests.post, ubah ke metode http Anda
sumber
mockresponse.json = lambda: {'key': 'value'}
mockresponse.json.return_value = {"key": "value"}
Jika Anda ingin mengejek respons palsu, cara lain untuk melakukannya adalah dengan hanya membuat instance instance dari kelas HttpResponse kelas, seperti:
sumber
HttpResponse
, bukannya ... Base, melakukan trik untukku. Terima kasih!Salah satu cara yang mungkin untuk mengatasi permintaan adalah menggunakan perpustakaan betamax, itu mencatat semua permintaan dan setelah itu jika Anda membuat permintaan dalam url yang sama dengan parameter yang sama betamax akan menggunakan permintaan yang direkam, saya telah menggunakannya untuk menguji crawler web dan itu menghemat banyak waktu.
https://betamax.readthedocs.io/en/latest/
sumber
Hanya sebuah petunjuk bermanfaat bagi mereka yang masih berjuang, mengubah dari urllib atau urllib2 / urllib3 ke permintaan DAN mencoba untuk mengejek tanggapan - Saya mendapatkan kesalahan yang sedikit membingungkan ketika menerapkan tiruan saya:
with requests.get(path, auth=HTTPBasicAuth('user', 'pass'), verify=False) as url:
Ya, tentu saja, jika saya tahu apa-apa tentang cara
with
kerjanya (saya tidak), saya akan tahu itu adalah konteks yang tidak penting dan tidak perlu (dari PEP 343 ). Tidak perlu saat menggunakan pustaka permintaan karena pada dasarnya melakukan hal yang sama untuk Anda di bawah tenda . Hapuswith
dan gunakan telanjangrequests.get(...)
dan Bob pamanmu .sumber
Saya akan menambahkan informasi ini karena saya mengalami kesulitan mencari cara untuk mengejek panggilan api async.
Inilah yang saya lakukan untuk mengejek panggilan async.
Inilah fungsi yang ingin saya uji
Anda masih membutuhkan kelas MockResponse
Anda menambahkan kelas MockResponseAsync
Ini tesnya. Yang penting di sini adalah saya membuat respons sebelumnya karena fungsi init tidak dapat async dan panggilan untuk getResponse adalah async sehingga semuanya diperiksa.
Jika Anda memiliki cara yang lebih baik untuk melakukannya, beri tahu saya, tetapi saya pikir itu cukup bersih seperti itu.
sumber