Cloud Code Functions
Test Unitari del Cloud Code con Parse e Jasmine
22 min
come creare un test unitario attraverso le loro funzioni cloud code introduzione questa sezione ti permetterà di controllare il funzionamento e il test delle tue funzioni localmente utilizzando la libreria parse server test runner prerequisiti per completare questo tutorial, avrai bisogno di un ambiente locale con node js installato per applicare i test unitari puoi seguire il tutorial ufficiale di nodejs per installare correttamente node js nel tuo terminale un'app creata su back4app segui il tutorial per creare una nuova app per imparare come creare un'app su back4app back4app command line configurato con il progetto segui il tutorial per impostare il cloud code per imparare come impostare il codice cloud per un progetto prima di tutto, dobbiamo parlare di test unitari! quando gli sviluppatori iniziano a scrivere una funzione con diverse intenzioni in mente, un punto principale evidente nella comunità del software è l'applicazione di scenari immaginari affinché il codice creato venga testato è necessario eseguire la procedura di test unitari poiché consente di testare il codice in parti, il che garantisce che il tuo codice principale rimanga intatto e non compromesso e ora, che ne dici di un semplice esempio pratico? supponiamo che tu debba scrivere una funzione per mostrare in una frase completa, il nome del lavoratore, la posizione e l'azienda dovremo scrivere la funzione per ottenere i seguenti elementi di input azienda posizione nome del lavoratore passaggi per completare il semplice test nel tuo terminale, inizialmente, creeremo una directory e configureremo prima la tua app di test (package json), utilizzando il seguente comando suggerimento utilizzando il npm init npm init comando, potrai creare il file package json copre solo gli elementi più comuni e cerca di indovinare valori predefiniti sensati per questo motivo, renderemo disponibili le dipendenze necessarie affinché il codice funzioni il risultato da “package json” sarà qualcosa di simile all'esempio qui sotto { "name" "yourfoldername", "version" "1 0 0", "description" "just a unit test with using a simple function ", "main" "index js", "scripts" { "test" "echo \\"error no test specified\\" && exit 1" }, "repository" { "type" "git", "url" "" }, "author" "your name", "license" "isc", "bugs" { "url" "{url}/issues" }, "homepage" "" } ora, creiamo il file (index js) utilizzando il comando qui sotto ora inseriremo il codice qui sotto nel file precedentemente creato, e la funzione inserirà un esempio che può dimostrare questo test con il codice 1 // index js 2 module exports = function(name, position, company) { 3 let sentence = "hi, " + name + "! you are " + position + " in " + company + " company "; 4 return sentence; 5 }; in nodejs, il modulo racchiude il codice correlato in un'unità di codice singola, e quando usi module exports , aumenta il codice incapsulato che può essere utilizzato in altri file testiamo 0/ infine, puoi lavorare con il tuo terminale suggerimento utilizzando la require() require() funzione, puoi importare ed esportare moduli, e nel caso sopra, stiamo usando questa funzione per richiedere un file all'interno di un'applicazione e utilizzando parse, posso testare la mia funzione? certo, come parametro di test, creeremo un backend per controllare le informazioni dei dipendenti di un'azienda strutturiamo le classi come parse user (riferimento per i dipendenti) username, email, password (richiesti) ti consigliamo di dare un'occhiata dettagliata alla guida di parse server per ottenere ulteriori informazioni sulle proprietà degli utenti infoemployee posizione dipartimento turno di lavoro userid (puntatore) 1 comprendere la nostra struttura finale iniziamo! useremo il guida javascript di parse server come parametro per lo sviluppo delle nostre funzioni innanzitutto, dopo aver completato la configurazione utilizzando l'interfaccia della riga di comando (vedi prerequisiti https //www back4app com/docs/cloud code functions/unit tests#content prerequisites ), comprenderemo come funzionerà con la struttura finale dei file avviso quando carichi i file nel tuo cloud code, l'interfaccia della riga di comando (vedi prerequisiti ) ignorerà gli altri file e caricherà solo quelli che si trovano nella cartella pubblica e cloud 2 scrivere la nostra funzione dopo aver configurato l'ambiente per l'interfaccia della riga di comando, scriveremo la funzione per costruire il processo di registrazione dell'employee e salvare le informazioni aggiuntive rifattorizzando il codice, nel file main js, importeremo queste funzioni in main, come 1 //in 1cloud/main js 2 3 var cloudfunctions = require(" /functions"); 4 5 / it's necessary to insert the parse instance in our code, 6 because at local context not is referenced / 7 8 parse cloud define("registeruser", cloudfunctions registeruser(parse)); 9 10 parse cloud beforesave("infoemployee", infoemployee infoemployee(parse)); l'idea è di separare le funzioni dall'interfaccia cloud in modo da poterle testare senza inviare richieste http in modo inefficiente questo avrà molto senso mentre creiamo la suite di test parse server 3 x 1 //in cloud/functions js 2 3 module exports registeruser = function(parse){ 4 return async(request) =>{ 5 let params = request params; //parameters received 6 let infoemployee = parse object extend("infoemployee"); //store information 7 8 let usercreated = new parse user({ 9 "email" params email, 10 "username" params username, 11 "password" params password 12 }) 13 14 //save relation 15 try { 16 let result = await usercreated save(); 17 18 let information = new infoemployee({ 19 "position" params position, 20 "department" params department, 21 "workshift" params shift, 22 "user" result 23 }); 24 25 return information save(); 26 } catch (e) { 27 return e message; 28 } 29 } 30 } 31 32 module exports infoemployee = function(parse){ 33 return async (request) =>{ 34 let req = request object; 35 36 if (!req get("position") || !req get("department") || !req get("workshift")) { 37 throw new error("missing params! the required parameters are position, department workshift"); 38 } else { 39 return; 40 } 41 } 42 } parse server 2 x 1 //in cloud/functions js 2 3 module exports registeruser = function(parse){ 4 return function (request, response){ 5 var params = request params; //parameters received 6 7 var infoemployee = parse object extend("infoemployee"); //store information 8 9 var usercreated = new parse user({ 10 "email" params email, 11 "username" params username, 12 "password" params password 13 }) 14 15 //save relation 16 usercreated save() then((updateduser) => { 17 var information = new infoemployee({ 18 "position" params position, 19 "department" params department, 20 "workshift" params shift, 21 "user" updateduser 22 }); 23 return information save(); 24 }) then((info) => response success(info)) 25 catch((e) => { 26 response error(e message); 27 }) 28 } 29 } 30 31 module exports infoemployee = function(parse){ 32 return function (request, response){ 33 var req = request object; 34 35 if (!req get("position") || !req get("department") || !req get("workshift")) { 36 response error("missing params! the required parameters are position, department workshift"); 37 } else { 38 response success(); 39 } 40 } 41 } 3 configurare l'ambiente per testare il codice sopra! per la nostra suite di test, utilizzeremo jasmine , un framework di test javascript molto popolare tuttavia, il nostro codice finora è completamente indipendente dai nostri test, quindi puoi utilizzare qualsiasi framework o piattaforma tu preferisca installa le dipendenze di sviluppo installiamo jasmine globalmente e utilizziamo, con i comandi qui sotto 4 configurare il parse server test runner nella cartella con i nostri metodi implementati nella cartella cloud del progetto in back4app, creeremo nuovi file nel nostro progetto su node js che configureranno questa interazione ora configureremo i file creati sopra con i codici mostrati di seguito index js 1 const promise = require('bluebird'); 2 const express = require('express'); 3 const http = require('http'); 4 const {mongoclient} = require('mongodb'); 5 const {parseserver} = require('parse server'); 6 7 const mongodbrunnerstart = require('mongodb runner/mocha/before') bind({ 8 timeout() { 9 }, 10 slow() { 11 }, 12 }); 13 const mongodbrunnerstop = require('mongodb runner/mocha/after'); 14 15 const startdb = () => ( 16 new promise((done, reject) => { 17 done fail = reject; 18 mongodbrunnerstart(done); 19 }) 20 ); 21 22 const stopdb = () => ( 23 new promise((done, reject) => { 24 done fail = reject; 25 mongodbrunnerstop(done); 26 }) 27 ); 28 29 const connectdb = (databaseuri) => new promise((resolve, reject) => { 30 mongoclient connect(databaseuri, (err, db) => { 31 if (err) { 32 reject(err); 33 } else { 34 resolve(db); 35 } 36 }); 37 }); 38 39 let parseserverstate = {}; 40 41 const dropdb = () => { 42 const {mongoconnection} = parseserverstate; 43 return mongoconnection dropdatabaseasync(); 44 }; 45 46 / 47 starts the parseserver idropdatabaseasyncnstance 48 @param {object} parseserveroptions used for creating the `parseserver` 49 @return {promise} runner state 50 / 51 function startparseserver(parseserveroptions = {}) { 52 const mongodbport = process env mongodb port || 27017; 53 const { 54 databasename = 'parse test', 55 databaseuri = 'mongodb //localhost ${mongodbport}/${databasename}', 56 masterkey = 'test', 57 javascriptkey = 'test', 58 appid = 'test', 59 60 port = 30001, 61 mountpath = '/1', 62 serverurl = 'http //localhost ${port}${mountpath}', 63 } = parseserveroptions; 64 65 return startdb() 66 then(() => connectdb(databaseuri)) 67 then((mongoconnection) => { 68 parseserveroptions = object assign({ 69 masterkey, javascriptkey, appid, 70 serverurl, 71 databaseuri, 72 silent process env verbose !== '1', 73 }, parseserveroptions); 74 const app = express(); 75 const parseserver = new parseserver(parseserveroptions); 76 77 app use(mountpath, parseserver); 78 79 const httpserver = http createserver(app); 80 81 promise promisifyall(httpserver); 82 promise promisifyall(mongoconnection); 83 84 return httpserver listenasync(port) 85 then(() => object assign(parseserverstate, { 86 parseserver, 87 httpserver, 88 mongoconnection, 89 expressapp app, 90 parseserveroptions, 91 })); 92 }); 93 } 94 95 / 96 stops the parseserver instance 97 @return {promise} 98 / 99 function stopparseserver() { 100 const {httpserver} = parseserverstate; 101 return httpserver closeasync() 102 then(stopdb) 103 then(() => parseserverstate = {}); 104 } 105 106 module exports = { 107 dropdb, 108 startparseserver, 109 stopparseserver, 110 parseserverstate, 111 }; jasmine js 1 const { startparseserver, stopparseserver, dropdb } = require('parse server test runner'); 2 3 describe('registeruser', () => { 4 beforeall((done) => { 5 const appid = 'test'; 6 const masterkey = 'test'; 7 const javascriptkey = 'test'; 8 9 startparseserver({ appid, masterkey, javascriptkey }) 10 then(() => { 11 parse initialize(appid, masterkey, javascriptkey); 12 parse serverurl = 'http //localhost 30001/1'; 13 }) 14 then(done) catch(done fail); 15 }, 300 60 2); 16 17 afterall((done) => { 18 stopparseserver() 19 then(done) catch(done fail); 20 }); 21 22 beforeeach((done) => { 23 dropdb() 24 then(done) catch(done fail); 25 }); 26 27 it('should work', (done) => { 28 const q = new parse query(' user') 29 q limit(5) 30 find({ usemasterkey true }) 31 then(console log) 32 then(done) catch(done fail); 33 }); 34 }); l'ultimo passo è configurare il package json, utilizzando il comando $ npm init $ npm init nella directory radice (il file qui sotto è solo un esempio con i moduli richiesti) 1 { 2 "name" "back4approject", 3 "version" "1 0 0", 4 "description" "back4app guide using for reference the parse server test runner", 5 "main" "index js", 6 "engines" { 7 "node" ">=6" 8 }, 9 "repository" { 10 "type" "", 11 "url" "" 12 }, 13 "keywords" \[ 14 "parse", 15 "parse server", 16 "testing", 17 "tests" 18 ], 19 "author" "", 20 "license" "isc", 21 "dependencies" { 22 "bluebird" "^3 5 0", 23 "express" "latest", 24 "mongodb" "^2 2 30", 25 "mongodb runner" "^3 5 0", 26 "parse" "^1 10 0", 27 "parse server" "^2 5 3", 28 "parse server test runner" "^1 0 0" 29 } 30 } e ora, verificherai che ci avviciniamo alla struttura descritta in questi precedenti https //www back4app com/docs/cloud code functions/unit tests#content structure passi ) 5 tornando al terminale inizieremo a configurare il test locale, per questo seguiremo il comando qui sotto per impostare programmaticamente per scopi di test dopo l'installazione riuscita, puoi controllare il tuo test unitario localmente con il comando descritto e ricevere il risultato, come meraviglioso, è pronto! con la guida descritta sopra, sei in grado di lavorare con il parse server test runner e le tue funzioni sviluppate per il cloud code su back4app