Advanced Guides
Integrasi Pengujian Parse Cloud Code untuk Developer
34 mnt
cara mengintegrasikan pengujian ke dalam fungsi parse cloud code anda pendahuluan ini adalah panduan yang ditulis oleh https //github com/considine , penulis tamu kami dan pengembang utama di https //koptional com/ tutorial ini mencakup cara mengatur pengujian otomatis untuk cloud code back4app anda kami akan membahas secara singkat tentang memindahkan beberapa kode parse klien anda ke cloud, dan kemudian tentang cara mengintegrasikan proyek anda dengan ekosistem pengujian anda juga dapat melihat proyek contoh https //github com/back4app/template cloud code unit test secara langsung untuk versi yang berfungsi tujuan kami berharap dapat menggabungkan aspek pengujian otomatis yang kuat dan dapat diskalakan dengan lingkungan parse yang ramah pengembang dengan memanfaatkan cloud code, mungkin fitur parse yang kurang dihargai, pengembang dapat terus dengan cepat mengiterasi kode mereka dan yakin bahwa perangkat lunak akan berjalan seperti yang diharapkan pengembangan berbasis pengujian https //en wikipedia org/wiki/test driven development adalah bidang yang sangat luas; daripada berbicara secara filosofis tentang pengujian, kami akan menjalankan implementasi dan membahas beberapa strategi (stubbing misalnya) prasyarat untuk menyelesaikan tutorial ini, anda perlu sebuah aplikasi di back4app ikuti tutorial membuat aplikasi baru untuk belajar cara membuat aplikasi di back4app back4app command line dikonfigurasi dengan proyek ikuti tutorial menyiapkan cloud code untuk belajar cara menyiapkan cloud code untuk proyek npm terinstal di command line anda catatan perpustakaan ini akan menggunakan https //www promisejs org/ , yang seharusnya tidak terlalu rumit mari kita buat backend media sosial dasar oke! bayangkan aplikasi media sosial yang mencakup model profil untuk disandingkan dengan model pengguna untuk beberapa aplikasi, anda mungkin menempatkan informasi profil dalam model pengguna, meskipun dalam banyak kasus ini tidak efisien; anda sering kali perlu memisahkan kepentingan otorisasi/otentikasi dengan konten pengguna, dan dengan demikian mempertahankan dua model yang berbeda dalam tutorial ini, kita akan menerapkan fitur yang mengelola pembuatan pengguna dan profil dengan cara ini, dengan memberikan beban minimal pada klien mari kita mulai! 1\ mendefinisikan fungsi kita ini mengasumsikan anda telah membuat proyek back4app, dan alat baris perintah terinstal (lihat prasyarat) untuk contoh kode frontend, panduan ini akan merujuk pada sintaks sdk javascript parse untuk kesederhanaan ketika seseorang mendaftar untuk aplikasi ini, profil harus dibuat dan dihubungkan dengan objek pengguna fungsi pendaftaran pada banyak aplikasi parse, anda akan membuat pengguna dengan sintaks berikut 1 var user = new parse user(); 2 user set("username", "my name"); 3 user set("password", "my pass"); 4 user set("email", "email\@example com"); dalam kasus kami, kami juga ingin menginisialisasi sebuah profil, dan mengarahkannya ke objek pengguna parse server 3 x 1 try { 2 await user signup(null, {usemasterkey true}); 3 let profile = parse object extend("profile"); 4 let profile = new profile({ 5 firstname params firstname, 6 lastname params lastname, 7 user user 8 }) 9 return profile save(null, {usemasterkey true}); 10 } catch (err){ 11 return (err message); 12 } parse server 2 x 1 user signup(null, { 2 success function (newuser) { 3 var profile = parse object extend("profile"); 4 var profile = new profile(); 5 profile set("firstname", "john"); 6 profile set("lastname", "smith"); 7 profile set("user", newuser); 8 profile save(); 9 }, 10 error function (err) { 11 // handle error 12 } 13 }) anda bisa memperpendek sintaks itu menjadi sesuatu seperti ini parse server 3 x 1 let user = new parse user({ 2 username params username, 3 password params password, 4 email params email 5 }); 6 7 try { 8 await user signup(null, {usemasterkey true}); 9 let profile = parse object extend("profile"); 10 let profile = new profile({ 11 firstname params firstname, 12 lastname params lastname, 13 user user 14 }) 15 return profile save(null, {usemasterkey true}); 16 } catch (err){ 17 return (err message); 18 } parse server 2 x 1 var user = new parse user({ 2 username params username, 3 password params password, 4 email params email 5 }); 6 user signup(null) 7 then((newuser) => { 8 var profile = parse object extend("profile"); 9 var profile = new profile({ 10 "firstname" "john", 11 "lastname" "smith", 12 "user" newuser 13 }); 14 return profile save(); 15 }) sayangnya, ini masih melibatkan pembuatan dua permintaan terpisah ke parse server yang tidak efisien untuk dilakukan oleh frontend; adalah bijaksana untuk menghindari alur komunikasi klien server bertahap ganda jika memungkinkan juga, terkait keamanan, kode di atas menempatkan proses pembuatan di tangan klien yang tidak pernah cerdas kami ingin mencegah integritas data kami bergantung pada klien yang menyelesaikan semua langkah alur dengan benar mereka bisa, misalnya, mengirim permintaan kustom yang membuat pengguna tanpa profil, merusak data persisten aplikasi mengapa tidak melakukan semua ini dalam satu langkah menggunakan kode cloud? ini dapat mencegah pembengkakan kode frontend, dan memastikan bahwa klien tidak melakukan pekerjaan yang tidak perlu/tidak aman! inilah yang ingin kami lakukan sebagai gantinya dari klien untuk pendaftaran 1 parse cloud run('signupuser', 2 { 3 username 'myname', 4 password "mypass", 5 email "email\@example com", 6 firstname "john", 7 lastname "smith" } 8 ) then(function(newuser) { 9 10 }); parse juga mendefinisikan untuk http //docs parseplatform org/cloudcode/guide/#beforesave triggers trigger, memungkinkan pembuatan profil saat pengguna mendaftar namun dengan menggunakan fungsi kita dapat secara intuitif melewatkan atribut firstname dan lastname yang akan digunakan profil fungsi pendaftaran kode cloud mari kita mulai! pindah ke direktori proyek anda yang disinkronkan dengan back4app (lihat prasyarat jika anda tidak tahu apa artinya) kami akan mengasumsikan struktur berikut dalam kasus kami, saat inisialisasi, kami memilih 'cloud' sebagai nama direktori kami direktori anda dapat disebut apa pun yang anda inginkan parse server 3 x main js 1 parse cloud define("signuserup", async(request) => { 2 // make sure the necessary parameters are passed first 3 let params = request params; 4 if (!params username || !params email || !params password || !params firstname || !params lastname) 5 throw new error("missing parameters need username, email, password, firstname, & lastname"); 6 7 // execute the signup flow 8 let user = new parse user({ 9 username params username, 10 password params password, 11 email params email 12 }); 13 14 try { 15 await user signup(null, {usemasterkey true}); 16 let profile = parse object extend("profile"); 17 let profile = new profile({ 18 firstname params firstname, 19 lastname params lastname, 20 user user 21 }) 22 return profile save(null, {usemasterkey true}); 23 } catch (err){ 24 return (err message); 25 } 26 }); parse server 2 x main js 1 parse cloud define("signuserup", function(request, response) { 2 // make sure the necessary parameters are passed first 3 var params = request params; 4 if (!params username || !params email || !params password || !params firstname || !params lastname) 5 return response error("missing parameters need username, email, password, firstname, & lastname"); 6 7 // execute the signup flow 8 var user = new parse user({ 9 username params username, 10 password params password, 11 email params email 12 }); 13 user signup(null, {usemasterkey true}) 14 then((newuser) => { 15 var profile = parse object extend("profile"); 16 var profile = new profile({ 17 firstname params firstname, 18 lastname params lastname, 19 user newuser 20 }) 21 return profile save(null, {usemasterkey true}); 22 }) 23 then((prof) => response success(prof)) 24 catch((e) => { 25 response error(e message); 26 }) 27 }); anda mungkin memperhatikan opsi 'usemasterkey' yang diteruskan; ini memungkinkan kode cloud untuk mengesampingkan peran atau acl yang mungkin ada karena klien tidak menyentuh kode ini, tidak ada risiko mereka mengambil alih server kami namun, harap berhati hati dengan bendera ini! jika tidak jelas mengapa ini mungkin lebih disukai daripada menempatkan fungsionalitas ini di kode klien, berikut adalah beberapa keuntungan memindahkan komputasi ke server daripada perangkat secara eksplisit mendefinisikan fungsionalitas dari suatu proses lebih mudah untuk membuat fungsi yang aman dari kegagalan memberikan klien antarmuka yang intuitif ini mencegah kemungkinan bahwa klien akan ‘setengah melakukan’ suatu proses 2\ mengubah struktur direktori kami bagus, kami telah membuat dua fungsi cloud kami jelas bisa menguji fungsi fungsi ini dengan menjalankannya dan memeriksa parse dashboard, tetapi itu tidak dapat diskalakan atau efisien sebaliknya, kami ingin membuat tes otomatis khusus untuk metode yang dapat dijalankan secara terus menerus jadi kami akan memisahkan kode kami sedikit kami akan memindahkan fungsi yang kami buat di main js ke file baru bernama cloud functions js (di direktori yang sama) kemudian kami akan mengimpor fungsi fungsi ini ke dalam main, dan mengikatnya ke definisi cloud function ideanya adalah untuk memisahkan fungsi fungsi dari antarmuka cloud sehingga kami dapat mengujinya tanpa mengirim permintaan http secara tidak efisien ini akan sangat masuk akal saat kami membuat suite tes membuat file fungsi anda mungkin sudah tahu bahwa anda dapat menggunakan ‘require’ di node js untuk menarik fungsi, objek, dan variabel dari file lain oleh karena itu, kami akan mendefinisikan fungsi yang sesuai dengan parse cloud function yang kami buat di langkah 1 satu poin yang mungkin membingungkan adalah bahwa fungsi yang kami definisikan akan mengembalikan fungsi , yang kemudian dapat dihubungkan ke definisi parse cloud mungkin terasa aneh menggunakan fungsi untuk mengembalikan fungsi, tetapi ini akan memberi kami kekuatan untuk mengganti parse servers nanti saat kami menulis tes kami anda mungkin telah memperhatikan bahwa anda dapat menggunakan objek parse di cloud code anda, tanpa harus mendefinisikan atau mengimpornya ini disebabkan oleh server yang menjalankan kode ini menambahkan parse secara otomatis namun, jika kami ingin menjalankan tes pada fungsi secara lokal, kami tidak memiliki instance sebenarnya, kami ingin menyediakan instance kami sendiri yang sesuai dengan server parse tes, di mana tidak ada bahaya dalam data yang dibuat atau dihapus jadi setiap fungsi akan menerima ‘parse’ sebagai parameter, dan mengembalikan fungsi cloud parse server 3 x cloud functions js 1 // cloud functions js 2 module exports signupuser = function(parse) { 3 return async(request) => { 4 // copied from main js 5 // make sure the necessary parameters are passed first 6 let params = request params; 7 if (!params username || !params email || !params password || !params firstname || !params lastname) 8 throw new error("missing parameters need username, email, password, firstname, & lastname"); 9 10 // execute the signup flow 11 let user = new parse user({ 12 username params username, 13 password params password, 14 email params email 15 }); 16 17 try { 18 await user signup(null, {usemasterkey true}); 19 let profile = parse object extend("profile"); 20 let profile = new profile({ 21 firstname params firstname, 22 lastname params lastname, 23 user user 24 }) 25 return profile save(null, {usemasterkey true}); 26 } catch (err){ 27 return (err message); 28 } 29 } 30 } parse server 2 x cloud functions js 1 // cloud functions js 2 module exports signupuser = function(parse) { 3 return function (request, response) { 4 // copied from main js 5 // make sure the necessary parameters are passed first 6 var params = request params; 7 if (!params username || !params email || !params password || !params firstname || !params lastname) 8 return response error("missing parameters need username, email, password, firstname, & lastname"); 9 // execute the signup flow 10 var user = new parse user({ 11 username params username, 12 password params password, 13 email params email 14 }); 15 user signup(null, {usemasterkey true}) 16 then((newuser) => { 17 var profile = parse object extend("profile"); 18 var profile = new profile({ 19 firstname params firstname, 20 lastname params lastname, 21 user newuser 22 }) 23 return profile save(null, {usemasterkey true}); 24 }) 25 then((prof) => response success(prof)) 26 catch((e) => { 27 response error(e message); 28 }) 29 } 30 } di main js, hapus semuanya dari sebelumnya impor cloud function, dan ikat fungsi tersebut ke definisi cloud function seperti ini 1 // main js 2 var cloudfunctions = require(" /cloud functions"); 3 // note that we are injecting the parse instance, which is automatically supplied in the 4 // context of parse cloud code, but not on local tests 5 parse cloud define("signuserup", cloudfunctions signupuser(parse)); bagus! kami tidak mengubah fungsionalitas sama sekali sejak langkah 1, tetapi kami telah memisahkan fungsi dari kode cloud di langkah berikutnya kami akan membuat pengujian unit! 3\ buat suite pengujian untuk suite pengujian kami, kami akan menggunakan jasmine https //jasmine github io/ , kerangka pengujian yang populer namun, kode kami sejauh ini sepenuhnya netral terhadap pengujian kami, jadi anda dapat menggunakan kerangka kerja atau platform apa pun yang anda pilih mari kita instal jasmine dan jasmine node (integrasi jasmine dan lingkungan node js kami) sekarang mari kita instal dua pustaka yang akan digunakan oleh suite pengujian kita ini akan menggunakan parse sdk untuk terhubung ke parse server palsu, dan pustaka events untuk menyiapkan objek permintaan sekarang, menggunakan utilitas jasmine, mari kita inisialisasi direktori pengujian kita jika anda mau, anda dapat menginstal jasmine secara global dengan $ npm install g jasmine $ npm install g jasmine , kemudian anda dapat menginisialisasi dengan $ jasmine init $ jasmine init panduan ini akan mengasumsikan anda tidak menginstal jasmine secara global, meskipun itu disarankan jika anda melakukannya, anda dapat mengganti semua instance ‘/node modules/jasmine/bin/jasmine js’ dengan hanya ‘jasmine’ ini harus membuat direktori bernama spec, yang di dalamnya termasuk folder dukungan yang berisi informasi konfigurasi untuk jasmine secara default, jasmine tahu untuk mencari file yang diakhiri dengan ekstensi “ spec js”, jadi kita akan menamai pengujian kita sesuai buat file untuk pengujian unit pertama kita tambahkan direktori utilitas dengan dua file yang akan membantu dengan pengujian kita akhirnya, buat file konstanta di direktori yang sama utilitas untuk file ini akan dijelaskan nanti berikut adalah tampilan direktori anda sekarang 4\ menukar dengan parse server pengujian pengujian di sekitar parse karena metode kita melibatkan parse server, kita ingin dapat menguji interaksi itu ada dua cara untuk melakukannya a kita dapat "stub" objek parse sdk, dengan mendefinisikan objek yang mengimplementasikan antarmuka yang sama kemudian cukup kirim objek itu sebagai parameter ke metode cloud kita itu mungkin terlihat seperti ini 1 var parsestub = { 2 // make sure all used methods and properties are defined 3 user function () { 4 // constructor function 5 this set = function (key, val) { 6 // logic here to implement the parse object set 7 } 8 } 9 } 10 signupuser(parsestub); // returns cloud function that we can test b pendekatan lain adalah menyiapkan parse server yang nyata yang hanya akan melayani data uji ini akan melibatkan lapisan http yang lambat yang digunakan parse, tetapi juga memungkinkan kita untuk menguji data di database dalam pengujian kita, kita perlu mengimpor parse sdk, dan mengkonfigurasinya dengan server uji dua tempat yang dapat di stub saat menguji kode cloud a ) stub parse sdk yang tidak akan membuat permintaan http, atau b ) tukar dengan implementasi database uji tidak ada dari kedua pendekatan ini yang merupakan jawaban "benar" itu tergantung pada apa yang ingin anda uji meng stub antarmuka untuk parse sdk (bahkan hanya bagian yang kita gunakan) adalah pekerjaan yang banyak selain itu, kita akan menguji ketahanan data setelah disimpan dalam contoh ini, jadi kita akan menggunakan pendekatan kedua mari buat parse server uji di back4app ambil application id, dan master key dan simpan ke dalam file konstanta kita inisialisasi parse sdk di file spesifikasi kita, sehingga pengujian kita menggunakan server uji anda dipersilakan untuk menjalankan parse server https //github com/parse community/parse server lokal untuk pengujian anda kita akan cukup membuat aplikasi back4app lain di dasbor kita jika anda perlu penyegaran tentang cara menyediakan server back4app lain, silakan kunjungi tutorial buat aplikasi baru https //www back4app com/docs/get started/new parse app sebut aplikasi anda apa pun yang anda inginkan, meskipun mungkin bijaksana untuk menggunakan sesuatu seperti testbackend kemudian ambil application id dan master key dari dashboard > pengaturan aplikasi > keamanan & kunci sekarang simpan token ini di file konstanta kita seperti ini 1 // /spec/constants js 2 // paste in your app id and master key where the strings are 3 module exports = { 4 application id "paste your application key here", 5 master key "paste your master key here" 6 } jangan masukkan id aplikasi dan kunci master dari aplikasi produksi anda!!! kami akan menghapus data, dan melakukannya akan berisiko kehilangan data 5\ utilitas pengujian fungsi cloud diteruskan sebagai parameter dalam objek permintaan dan respons express server secara otomatis membuat parameter ini ketika dijalankan di cloud, jadi untuk lingkungan pengujian kita harus membuat ganda kasus ini lebih mudah ketika fungsi cloud dipanggil, data diteruskan; dalam kasus kita, profil dan informasi pengguna diteruskan setiap argumen yang diberikan dapat diakses dari properti request params jadi jika kita memanggil fungsi cloud seperti 1 // client code, calling parse function 2 parse cloud run('fakefunction', 3 { 4 data1 'i am data1', 5 data2 { 6 prop "nested property" 7 } 8 } 9 ); maka properti request params akan berisi data yang diteruskan 1 // server code, running the parse function 2 console log(request params); 3 // { 4 // data1 'i am data1', 5 // data2 { 6 // prop "nested property" 7 // } 8 // } cukup sederhana, untuk pengujian kami, saat memanggil fungsi cloud kami, argumen pertama harus dalam bentuk 1 { 2 params { 3 username 'testuser', 4 firstname "john", 5 // the rest of the arguments 6 } 7 } dengan demikian, kami tidak perlu membuat objek tiruan khusus dalam kasus ini objek respons memungkinkan kode cloud untuk mengirim respons http ke klien yang mewakili baik keberhasilan atau kegagalan kami ingin tahu apa yang disebut saat memanggil fungsi cloud di bawah ini adalah sebuah objek tiruan https //msdn microsoft com/en us/library/ff650441 aspx yang akan memungkinkan pengujian kami untuk menentukan apakah pemanggilan tersebut berhasil atau tidak jika ini membingungkan, jangan khawatir, cukup tempatkan di file /spec/utils/response stub js anda 1 // /spec/utils/response stub js 2 const eventemitter = require('events'); 3 / 4 wrapper around response stub simplifies testing cloud functions that 5 employ a response parameter 6 / 7 function responsestub () { 8 this responselistener = new eventemitter(); 9 this responsestub = {}; 10 / 11 success method that cloud functions expect 12 / 13 this responsestub success = (resp) => { 14 this responselistener emit("success", resp); 15 } 16 / 17 error method that cloud functions expect 18 / 19 this responsestub error = (resp) => { 20 this responselistener emit("error", resp); 21 } 22 / 23 listens for errors and successes from stub and returns promise that resolves or rejects accordingly 24 / 25 this resolver = new promise((resolve, reject) => { 26 this responselistener on("success", (resp) => resolve(resp)); 27 this responselistener on("error", (err) => reject(err)); 28 }); 29 } 30 31 / 32 reeturns stub to feed to cloud function 33 / 34 responsestub prototype getstub = function () { 35 return this responsestub; 36 } 37 38 / 39 returns promise that will indicate the success or failure 40 / 41 responsestub prototype oncomplete = function () { 42 return this resolver; 43 } 44 45 module exports = responsestub; singkatnya, fungsi konstruktor javascript ini akan memberikan cara bagi pengujian kami untuk memasukkan objek respons yang menunjukkan melalui resolusi / penolakan promise apakah fungsi cloud akan mengembalikan keberhasilan atau kesalahan membersihkan basis data kami jelas tidak ingin basis data parse pengujian kami menyimpan apa yang terakumulasi selama pengujian mari kita definisikan utilitas untuk membersihkan tabel basis data, yang dapat dipanggil sebelum (atau setelah) kasus pengujian tambahkan yang berikut ke ‘spec/utils/purge parse table js’ 1 // spec/utils/purge parse table js 2 / 3 removes all rows from the parse database 4 @param {string} tablename the name of the parse table to be purged 5 @return {promise} promise to destroy each item in the table 6 / 7 module exports = function (parse) { 8 return (tablename) => { 9 var tablequery; 10 if (tablename === "user") 11 tablequery = new parse query(parse user); 12 else tablequery = new parse query(tablename); 13 return tablequery find({usemasterkey true}) then((items) => { 14 var destroyqueue = \[]; 15 for (var i=0; i\<items length; i++) { 16 destroyqueue push(items\[i] destroy({usemasterkey true})); 17 } 18 return promise all(destroyqueue) catch((e) => {console log("error destroying " + e message)}); 19 }); 20 } 21 } setelah mendefinisikan fungsi ini, ini adalah waktu yang baik untuk mengingatkan anda untuk memastikan bahwa spec/utils/constants js anda dikonfigurasi untuk aplikasi parse test anda, bukan aplikasi parse produksi anda ini akan menghapus data, jadi harap konfirmasi bahwa ini adalah database kosong yang anda buat di atas fungsi ini menerima sdk parse yang telah kita konfigurasi, dan mengembalikan fungsi lain fungsi yang dikembalikan menerima nama tabel, dan menghapus semua data dari tabel parse yang sesuai sekali lagi, ide mengembalikan fungsi mungkin tampak aneh, tetapi ini memungkinkan spesifikasi pengujian untuk mengonfigurasi endpoint parse, dan kemudian merujuk ke fungsi yang akan menghapus tabel endpoint parse itu keren! sekarang mari kita tulis pengujian kita! 6\ uji bahwa fungsi cloud akan mengirimkan kesalahan jika parameter yang tepat tidak dikirim fungsi cloud bergantung pada parameter tertentu yang disertakan dan harus gagal jika, misalnya, ‘firstname’ tidak dikirim mari kita pastikan kita akan mengedit file pengujian kita (akhirnya!) spec/signup user spec js ini yang perlu dilakukan sebelum definisi tes impor sdk nodejs parse impor konstanta kami, dan konfigurasikan sdk parse untuk mengarah ke server pengujian kami impor fungsi cloud kami impor utilitas “purge table” kami impor objek mock respons yang kami buat yang berikut akan dilakukan 1 // hook into your testing server 2 var parse = require('parse/node'); 3 var constants = require(" /constants"); 4 // head over to your parse dash board for your test server, and grab your keys swap out the strings with the place holders below 5 parse initialize(constants application key, null, constants master key); 6 // if you are running a localhost parse server, set the serverurl accordingly 7 parse serverurl = 'https //parseapi back4app com' 8 var signupuser = require(" /cloud/cloud functions") signupuser(parse); 9 var purgetable = require(" /utils/purge parse table")(parse); 10 var responsestub = require(" /utils/response stub"); sekarang mari kita tambahkan kasus uji pengenalan jasmine https //jasmine github io/2 1/introduction mungkin membantu untuk memahami struktur dengan lebih baik, tetapi terlihat seperti ini (diambil dari pengantar) jadi blok deskripsi mengenkapsulasi suite tes, dan blok ‘it’ mewakili kasus dan harapan dengan melewatkan parameter ke blok ‘it’, anda dapat menjalankan tes secara asinkron tes tidak akan selesai sampai parameter dipanggil seperti ini ini berguna karena salah satu tes kami akan menggunakan http, sehingga harus dijalankan secara asinkron dengan cara ini karena menggunakan http adalah prosedur non blokir di nodejs selain itu, jasmine memungkinkan blok khusus dalam suite yang dapat dijalankan pada titik yang berbeda dalam siklus hidup pengujian kami ingin menghapus semua tabel sebelum setiap pengujian, jadi kami akan mengeksekusi kode pembersihan di blok beforeeach cukup berbicara, mari kita tambahkan beberapa kode! tempatkan kode di bawah ini ke dalam spec/signup user spec js anda, di bawah impor yang sudah kami tambahkan 1 //spec/signup user spec js 2 // imports above 3 describe("signupuser", ()=> { 4 beforeeach((done) => { 5 /// purge the user and profile tables, and then proceed 6 promise all(\[purgetable("user"), purgetable("profile")]) 7 catch((e) => fail(e)) 8 then(() => done()); 9 }); 10 it ("should reject a request to signup that does not contain all the parameters", (done) => { 11 var responsestub = new responsestub(); 12 responsestub oncomplete() 13 then(() => fail("should have failed due to invalid parameters")) 14 catch((e) => {}) 15 then(() => done()); 16 17 signupuser({ params {}}, responsestub getstub()); 18 19 }); 20 }); keren, pengujian pertama kami sudah selesai di blok beforeeach, kami menghapus tabel user dan profile kemudian kasus pengujian pertama dipicu ini memverifikasi bahwa mengirimkan parameter yang tidak valid ke fungsi signupuser menyebabkan fungsi tersebut mengirimkan kesalahan ini menggunakan stub respons untuk memastikan fungsi akhirnya ditolak karena ‘signupuser’ akan gagal, blok ‘then’ awal pada stub tidak boleh dipanggil jika dipanggil, maka pengujian kami gagal! silakan jalankan pengujian menggunakan yang berikut anda seharusnya melihat output berikut 7\ uji pada persistensi data semoga anda memiliki satu uji lagi dalam diri anda! kami akan memverifikasi bahwa ketika fungsi cloud kami berjalan dengan baik, basis data kami akan sesuai harapan sebuah profil akan ada, dengan referensi ke objek pengguna, keduanya dengan atribut yang diharapkan tambahkan blok berikut ke blok suite ‘describe’ yang ada 1 //spec/signup user spec js 2 // inside describe 3 it ("should signup a user, and also create a profile that contains a reference to the user", (done) => { 4 var responsestub = new responsestub(); 5 var stub = responsestub getstub(); 6 signupuser({ 7 params { 8 firstname "john", 9 lastname "smith", 10 email "jsmith\@example com", 11 username "jsmith1", 12 password "secretcatchphrase1" 13 }, 14 }, 15 stub 16 ); 17 responsestub oncomplete() 18 then((resp) => { 19 var profileq = new parse query("profile"); 20 profileq equalto("lastname", "smith"); 21 return profileq find({usemasterkey true}); 22 }) 23 // check to make sure the profile we retrieve is valid 24 then((profiles) => { 25 if (profiles length === 0) throw new error("no profile's found"); 26 expect(profiles\[0] get('firstname')) tobe("john"); 27 // get the corresponding user 28 return profiles\[0] get("user") fetch({usemasterkey true}) 29 }) 30 // check to make sure the user is what we expect 31 then((user) => { 32 expect(user getusername()) tobe("jsmith1"); 33 }) 34 catch((e) => { 35 console log(e) 36 fail(e); 37 }) 38 then(() => done()); 39 }); oke ini banyak, jadi mari kita langkah demi langkah melalui apa yang terjadi kami menginstansiasi objek mock respons, seperti pada kasus uji pertama kemudian kami menjalankan signupuser dengan double permintaan yang berisi parameter yang valid, serta mock respons (baris 6 16) selanjutnya, kode ini mendengarkan metode oncomplete objek mock, yang akan mengembalikan sebuah promise promise akan ditolak jika response error dipanggil, dan akan diselesaikan jika response success dipanggil setiap penolakan akan menyebabkan rantai promise melompati blok catch oleh karena itu, metode fail ditempatkan di blok catch, karena uji harus gagal jika promise ditolak respons dari promise seharusnya menyelesaikan ke objek profil setelah diselesaikan, kami akan melakukan kueri untuk profil dengan nama belakang yang sama seperti yang kami buat (baris 19 21) kemudian uji mengonfirmasi bahwa ‘firstname’ dari profil adalah yang sama dengan yang kami berikan (baris 25 26) blok berikutnya mengambil objek pengguna yang terkait dengan profil pointer objek parse mengambil secara terpisah, oleh karena itu diperlukan blok promise lain akhirnya, kode mengonfirmasi bahwa pengguna yang sesuai memiliki nama pengguna yang diberikan ke fungsi signupuser kemudian uji selesai silakan jalankan suite sekali lagi silakan jalankan tes menggunakan yang berikut anda seharusnya melihat output berikut keren! kami telah menulis beberapa kode cloud, dan mengintegrasikan kerangka pengujian kesimpulan jika anda tersesat, atau hanya ingin kode untuk contoh ini, silakan kunjungi repo github https //github com/back4app/template cloud code unit test ikuti instruksi untuk mengunduh dan menjalankannya jika ada yang tidak jelas, atau tidak berfungsi, silakan hubungi saya melalui gmail saya, jackconsidine3 saya harap anda menikmati tutorial ini, dan mendapatkan beberapa wawasan!