PENGUJIAN
Cara meniru permintaan jaringan di Jest
Mengejek permintaan jaringan menjadi lebih mudah
Saat ini, perpustakaan lama perlu dimodifikasi menjadi TS
dan melakukan pengujian unit. Kalau perpustakaannya diubah menjadi TS
, masih ada sedikit lebih baik. Pengujian unit adalah murni studi terkini dan dijual sekarang. Bagi pemula yang mempelajari framework Jest
, menurut saya hal yang lebih merepotkan dalam pengujian unit adalah menguji permintaan jaringan. Jadi catat beberapa cara yang Mock
hilangkan Axios
untuk memulai permintaan jaringan. Ini adalah artikel Medium saya yang ke-39.
Perkenalan
Contoh-contoh yang disebutkan dalam artikel semuanya ada di repositori jest-mock-server. Anda dapat memulai contoh secara langsung dengan menginstal manajer paket, misalnya menginstal melalui yarn
:
$ yarn install
Beberapa perintah ditentukan di package.json
, yaitu sebagai berikut:
npm run build
: Perintah pengemasanrollup
.npm run test:demo1
: Cukupmock
perpustakaan permintaan jaringan dienkapsulasi.npm run test:demo2
: Selesaikanmock
dengan menerapkan kembalihook
.npm run test:demo3
: Gunakan perpustakaan diJest
untuk menyelesaikan implementasidemo2
.npm run test:demo4-5
: Memulai servernode
,proxy
permintaan jaringan melalui proxyaxios
, dan meneruskannya ke servernode
yang dimulai. Dengan mengatur permintaan pengujian unit dan data respons yang sesuai, hubungan yang sesuai digunakan untuk merealisasikan pengujian, yaitujest-mock-server
pekerjaan selesai.
Di sini kita merangkum lapisan axios
, yang lebih dekat dengan pemandangan sebenarnya. Anda dapat melihat file test/demo/wrap-request.ts
. Faktanya, ini hanya membuat instance axios
secara internal dan meneruskan data respons.
File test/demo/index.ts
hanya mengekspor metode counter
, di mana kedua parameter ini diproses sampai batas tertentu sebelum permintaan jaringan dimulai. Kemudian data respon juga diproses sampai batas tertentu, hanya untuk mensimulasikan operasi terkait.
Di sini Jest
menggunakan lingkungan browser yang disimulasikan oleh JSDOM
, file startup test/config/setup.js
dikonfigurasi dalam atribut setupFiles
yang dikonfigurasi di jest.config.js
, dan JSDOM
diinisialisasi di sini.
demo1: Permintaan jaringan Mock sederhana
Pemrosesan mock
sederhana dilakukan di test/demo1.test.js
, dan Anda dapat mencoba menjalankannya melalui npm run test:demo1
. Faktanya, operasi mock
dilakukan pada perpustakaan wrap-request
yang membungkus axios
. wrap-request
akan dikompilasi ketika Jest
dimulai. Setelah perpustakaan diolok-olok di sini, semua file yang diimpor ke perpustakaan setelahnya akan mendapatkan objek yang diolok-olok. Dengan kata lain, kita dapat berpikir bahwa perpustakaan ini telah ditulis ulang, dan metode setelah penulisan ulang semuanya adalah JEST
's Mock Functions
. Anda dapat menggunakan fungsi seperti mockReturnValue
untuk simulasi data. Untuk Mock Functions
, silakan merujuk ke tautan ini.
Di sini kita telah menyelesaikan Mock
dari nilai yang dikembalikan, yang berarti kita dapat mengontrol nilai yang dikembalikan oleh request
di perpustakaan wrap-request
. Namun telah disebutkan sebelumnya bahwa ada juga proses tertentu untuk parameter yang masuk. Kami belum membuat pernyataan apa pun mengenai bagian konten ini, jadi kami juga perlu mencoba menanganinya.
demo2: kaitkan permintaan jaringan
demo2
dapat dicoba dijalankan melalui npm run test:demo2
. Seperti disebutkan di atas, kita dapat menangani nilai yang dikembalikan tetapi tidak ada cara untuk memastikan apakah parameter masukan diproses dengan benar sehingga kita perlu menangani situasi ini. Untungnya, Jest
menyediakan cara untuk langsung mengimplementasikan pustaka fungsi yang diolok-olok. Oleh karena itu, Jest
juga menyediakan metode mockImplementation
, yang digunakan di demo3
. Di sini kami telah menulis ulang pustaka fungsi tiruan. Kita juga dapat menggunakan jest.fn
untuk menyelesaikan Implementations
. Di sini kita menulis fungsi hook
sebelum mengembalikan dan kemudian mengimplementasikan pernyataan atau menentukan nilai pengembalian di setiap test
. Dengan cara ini permasalahan di atas dapat diselesaikan, yang sebenarnya merupakan realisasi dari mockImplementation
dari Mock Functions
in Jest
.
demo3: Gunakan Implementasi tiruan Jest
demo3
dapat dicoba dijalankan melalui npm run test:demo3
. Contoh di demo2
sebenarnya rumit untuk ditulis. Pada Jest
, Mock Functions
memiliki implementasi mockImplementation
yang dapat digunakan secara langsung.
demo4–5: Benar-benar memulai permintaan jaringan
demo4
dan demo5
dapat dicoba dijalankan melalui npm run test:demo4–5
. Dengan cara ini, permintaan data nyata dibuat. Di sini, proxy axios
akan digunakan untuk meneruskan permintaan data internal ke port server yang ditentukan. Oleh karena itu, server juga dimulai secara lokal dan pengujian dilakukan dengan menentukan data permintaan dan respons yang terkait dengan path
yang sesuai. Jika data yang diminta salah maka data respons terkait tidak akan cocok secara normal. Oleh karena itu, permintaan tersebut akan langsung mengembalikan 500
. Jika data respons yang dikembalikan salah, data tersebut juga akan diambil selama pernyataan. Di perpustakaan jest-mock-server
, pertama-tama, kita perlu menentukan tiga file yang sesuai dengan tiga siklus hidup setiap file pengujian unit yang akan dieksekusi sebelum startup. Tes Jest
dijalankan sebelum tiga siklus hidup dan tiga siklus hidup dieksekusi setelah tes Jest
selesai. Tiga file yang perlu kita tentukan adalah item konfigurasi setupFiles
, globalSetup
, dan globalTeardown
dari file konfigurasi jest.config.js
.
Pertama kita akan mulai dengan setupFiles
. Selain menginisialisasi JSDOM
, kita juga perlu mengoperasikan proxy default axios
. Karena solusi yang diambil adalah menggunakan proxy
dari axios
untuk meneruskan permintaan data. Oleh karena itu, nilai proksi perlu ditetapkan di bagian depan pengujian unit.
Setelah kita menyiapkan file di atas di dalam foldertest/config
maka kita perlu menambahkan dua file lagi di sana yaitu globalSetup
dan globalTeardown
. Kedua file ini mengacu pada operasi yang dilakukan sebelum pengujian unit Jest
dimulai dan setelah semua pengujian selesai. Kami menempatkan operasi startup dan shutdown server di dua file tersebut.
Harap dicatat bahwa file yang berjalan di kedua file ini adalah
contex
terpisah yang tidak ada hubungannya dengancontex
pengujian unit apa pun termasuk file yang ditentukan oleh item konfigurasi setupFiles. Oleh karena itu, semua data di sini ditentukan dalam file konfigurasi, atau dikirim antar port server melalui jaringan.
Untuk informasi konfigurasi port dan nama domain, langsung taruh pada kolom globals
di jest.config.js
. Untuk item konfigurasi debug
, disarankan untuk menggunakannya bersama dengan test.only
.
Sekarang, mungkin ada saran mengapa server tidak boleh dimulai dan dimatikan dalam siklus hidup beforeAll
dan afterAll
dari setiap file pengujian unit. Oleh karena itu, saya telah mencoba solusi ini. Dalam solusi ini, untuk setiap file pengujian, server dimulai dan kemudian dimatikan. Oleh karena itu, solusi ini relatif memakan waktu. Namun secara teori, solusi ini masuk akal. Memang benar isolasi data itu perlu. Namun ada masalah saat afterAll
ditutup. Itu tidak benar-benar menutup penggunaan server dan port karena metode close
dipanggil ketika server node
ditutup. KetikaafterAll
ditutup, ia hanya berhenti memproses permintaan tetapi port masih ditempati. Ketika file pengujian unit kedua dimulai, pengecualian akan diberikan bahwa port sedang digunakan. Meskipun saya mencoba beberapa solusi, solusi tersebut tidak ideal karena terkadang port masih sibuk. Apalagi saat node
dijalankan pertama kali setelah dinyalakan, kemungkinan terjadinya kelainan relatif tinggi. Oleh karena itu, efeknya tidak terlalu memuaskan. Pada akhirnya, skema isolasi lengkap diadopsi. Untuk masalah terkait yang spesifik, silakan merujuk ke tautan ini.
Karena kami mengadopsi solusi yang sepenuhnya terisolasi, hanya ada dua opsi ketika kami ingin mengirimkan data permintaan dan respons untuk permintaan pengujian. Dua solusinya adalah ketika server dimulai, semua data ditentukan dalam file test/config/global-setup.js
atau data ditransmisikan melalui jaringan ketika server berjalan, jalur ditentukan dan permintaan jaringan dari jalur tersebut akan membawa data dan data permintaan akan ditentukan dalam penutupan server. Oleh karena itu, kedua opsi tersebut didukung di sini. Menurut saya lebih tepat untuk menentukan data Anda sendiri di setiap file unit test, jadi di sini hanya satu contoh menentukan data yang akan diuji di file unit test. Mengenai data yang akan diuji, tipe DataMapper
ditentukan untuk mengurangi pengecualian yang disebabkan oleh kesalahan tipe. Oleh karena itu, dua kumpulan data dicontohkan di sini. Selain itu, ekspresi reguler didukung saat mencocokkan query
dan data
. Struktur tipe DataMapper
relatif standar.
Dalam dua pengujian unit di bawah ini, data yang akan diuji ditentukan dalam beforeAll
. Perhatikan bahwa beforeAll
adalah return setSuitesData(data) karena pengujian unit dijalankan setelah data disetel dan respons berhasil, diikuti dengan permintaan normal dan respons apakah pengujian pernyataan benar.