Cloud Code Functions
Pruebas unitarias de Cloud Code con Parse Server
22 min
cómo crear una prueba unitaria a través de sus funciones de cloud code introducción esta sección le permitirá verificar el funcionamiento y la prueba de sus funciones localmente utilizando la biblioteca parse server test runner requisitos previos para completar este tutorial, necesitarás un entorno local con node js instalado para aplicar pruebas unitarias puedes seguir el tutorial oficial de nodejs para instalar node js con éxito en tu terminal una aplicación creada en back4app sigue el tutorial de crear nueva aplicación para aprender cómo crear una aplicación en back4app back4app command line configurado con el proyecto sigue el tutorial de configuración de cloud code para aprender cómo configurar el código en la nube para un proyecto primero, ¡necesitamos hablar sobre la prueba unitaria! cuando los desarrolladores comienzan a escribir una función con diferentes intenciones en mente, un punto importante evidente en la comunidad de software es la aplicación de escenarios imaginarios para que el código creado sea probado es necesario realizar el procedimiento de pruebas unitarias, ya que permite probar el código en partes, lo que asegura que tu código principal permanezca intacto y sin compromisos ¿y ahora, qué tal un ejemplo práctico simple? supongamos que necesitas escribir una función para mostrar en una oración completa, el nombre del trabajador, la posición y la empresa necesitaremos escribir la función para obtener los siguientes elementos de entrada empresa posición nombre del trabajador pasos para completar la prueba simple en tu terminal, inicialmente, crearemos un directorio y configuraremos tu aplicación de prueba (package json) primero, usando el siguiente comando consejo usando el npm init npm init comando, podrás crear el archivo package json solo cubre los elementos más comunes y trata de adivinar valores predeterminados sensatos debido a esto, haremos disponibles las dependencias necesarias para que el código funcione el resultado de “package json” será algo como el siguiente ejemplo { "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" "" } ahora, vamos a crear el archivo (index js) usando el comando a continuación ahora insertaremos el código a continuación en el archivo creado previamente, y la función insertará un ejemplo que puede demostrar esta prueba con el código 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 }; en nodejs, el módulo encapsula el código relacionado en una sola unidad de código, y cuando usas module exports , aumenta el código encapsulado que puede ser utilizado en otros archivos probemos 0/ finalmente, puedes trabajar con tu terminal consejo usando la require() require() función, puedes importar y exportar módulos, y en el caso anterior, estamos usando esta función para requerir un archivo dentro de una aplicación y usando parse, ¿puedo probar mi función? por supuesto, como parámetro de prueba, crearemos un backend para controlar la información de los empleados de una empresa estructuraremos las clases como parse user (referencia para empleados) nombre de usuario, correo electrónico, contraseña (requerido) te recomendamos que eches un vistazo detallado a la guía de parse server para obtener más información sobre las propiedades de usuario infoempleado posición departamento turno de trabajo userid (puntero) 1 entender nuestra estructura final ¡comencemos! usaremos el guía de javascript de parse server como parámetro para el desarrollo de nuestras funciones primero, después de completar la configuración usando la interfaz de línea de comandos (ver prereqs https //www back4app com/docs/cloud code functions/unit tests#content prerequisites ), entenderemos cómo funcionará con la estructura final de los archivos nota cuando subas los archivos a tu cloud code, la interfaz de línea de comandos (ver prereqs ) ignorará los otros archivos y solo subirá los que están en la carpeta pública y en la carpeta cloud 2 escribiendo nuestra función después de configurar el entorno para la interfaz de línea de comandos, escribiremos la función para construir el proceso de registrar al empleado y guardar la información adicional al refactorizar el código, en el archivo main js, importaremos estas funciones en main, como 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)); la idea es desacoplar las funciones de la interfaz de la nube para que podamos probarlas sin enviar solicitudes http de manera ineficiente esto tendrá mucho sentido a medida que creemos el conjunto de pruebas 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 ¡configurando el entorno para probar el código anterior! para nuestro conjunto de pruebas, utilizaremos jasmine , un marco de pruebas de javascript muy popular sin embargo, nuestro código hasta ahora es completamente agnóstico a nuestras pruebas, por lo que puedes usar cualquier marco o plataforma que prefieras instalar las dependencias de desarrollo vamos a instalar jasmine globalmente y usarlo, con los comandos a continuación 4 configurando el corredor de pruebas de parse server en la carpeta con nuestros métodos implementados en la carpeta del proyecto cloud en back4app, crearemos nuevos archivos en nuestro proyecto en node js que configurarán esta interacción ahora, configuraremos los archivos creados arriba con los códigos que se muestran a continuación 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 }); el último paso es configurar el package json, usando el comando $ npm init $ npm init en el directorio raíz (el archivo a continuación es solo un ejemplo con los módulos requeridos) 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 } y ahora, comprobarás que nos acercamos a la estructura descrita en estos pasos anteriores https //www back4app com/docs/cloud code functions/unit tests#content structure ) 5 regresando a la terminal comenzaremos a configurar las pruebas locales, para esto seguiremos el comando a continuación para configurar programáticamente con fines de prueba después de la instalación exitosa, podrás verificar tu prueba unitaria localmente con el comando descrito y recibir el resultado, como ¡maravilloso, está listo! con la guía descrita arriba, podrás trabajar con el parse server test runner y tus funciones desarrolladas para el cloud code en back4app