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 pengemasan rollup .
  • npm run test:demo1 : Cukup mock perpustakaan permintaan jaringan dienkapsulasi.
  • npm run test:demo2 : Selesaikan mock dengan menerapkan kembali hook.
  • npm run test:demo3 : Gunakan perpustakaan di Jest untuk menyelesaikan implementasi demo2.
  • npm run test:demo4-5 : Memulai server node, proxy permintaan jaringan melalui proxy axios, dan meneruskannya ke server node yang dimulai. Dengan mengatur permintaan pengujian unit dan data respons yang sesuai, hubungan yang sesuai digunakan untuk merealisasikan pengujian, yaitu jest-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 Functionsin 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 Functionsmemiliki 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 dengan contex 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.