Cloud Code Functions
基于Parse Server的云代码函数单元测试指南
19 分
如何通过他们的云代码函数创建单元测试 介绍 本节将允许您使用库检查函数的操作和本地测试 parse server test runner 先决条件 要完成本教程,您需要: 一个安装了 node js 的本地环境,以应用单元测试。您可以按照 官方 nodejs 教程 在您的终端成功安装 node js。 在 back4app 创建的应用。 按照 创建新应用教程 学习如何在 back4app 创建应用。 与项目配置的 back4app 命令行工具。 按照 设置云代码教程 学习如何为项目设置云代码。 首先,我们需要谈谈单元测试! 当开发人员开始编写具有不同意图的函数时,软件社区中一个显著的观点是应用想象场景来测试创建的代码。执行单元测试程序是必要的,因为它允许您分部分测试代码,这确保了您的主代码保持完整且不受损害。 那么,现在来一个简单的实际例子怎么样? 假设您需要编写一个函数,以完整的句子显示工人的姓名、职位和公司。我们需要编写函数以获取以下输入项: 公司 职位 工人姓名 完成简单测试的步骤 在您的终端中,首先,我们将创建一个目录并配置您的测试应用(package json),使用以下命令: 提示: 使用 npm init npm init 命令,您将能够创建 package json 文件。它仅涵盖最常见的项目,并尝试猜测合理的默认值。因此,我们将提供代码正常运行所需的依赖项。 “package json”的结果将类似于以下示例: { "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" "" } 现在,让我们使用下面的命令创建文件(index js) 我们现在将下面的代码插入到之前创建的文件中,该函数将插入一个示例,以演示此测试的代码 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 }; 在 nodejs 中,模块将相关代码封装成一个单元,当你使用 module exports , 它增加了可以在其他文件中使用的封装代码。 让我们测试 0/ 最后,你可以使用你的终端 提示 使用 require() require() 函数,你可以导入和导出模块,在上述情况下,我们使用此函数在应用程序内部要求一个文件。 使用 parse,我可以测试我的函数吗? 当然,作为测试参数,我们将创建一个后端来控制公司员工的信息。 让我们将类结构化为 parse user(员工参考) 用户名,电子邮件,密码(必填) 我们建议你详细查看 parse server 指南,以获取有关用户属性的更多信息。 infoemployee 职位 部门 工作班次 用户id(指针) 1 理解我们的最终结构 让我们开始吧!我们将使用 parse server javascript 指南 作为我们函数开发的参数。首先,在使用命令行界面完成设置后 (见前提条件 https //www back4app com/docs/cloud code functions/unit tests#content prerequisites ),我们将理解它如何与文件中的最终结构一起工作: 注意: 当您将文件上传到云代码时,命令行界面(见 前提条件 )将忽略其他文件,仅上传公共和云文件夹中的文件。 2 编写我们的函数 在为命令行界面配置环境后,我们将编写函数以构建注册员工并保存附加信息的过程。通过重构代码,在 main js 文件中,我们将这些函数导入到 main 中,如下所示: 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)); 这个想法是将功能与云接口解耦,以便我们可以在不低效发送http请求的情况下测试它们。这在我们创建测试套件时将非常有意义。 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 设置环境以测试上述代码! 对于我们的测试套件,我们将使用 jasmine , 一个非常流行的javascript测试框架。然而,到目前为止,我们的代码完全与我们的测试无关,因此您可以使用您喜欢的任何框架或平台。 安装开发依赖 让我们全局安装 jasmine,并使用以下命令 4 在文件夹中配置 parse server 测试运行器 在我们在back4app的项目cloud文件夹中实施的方法下,我们将在node js项目中创建新文件,以配置这种交互。 现在,我们将使用下面显示的代码配置上述创建的文件: 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 }); 最后一步是配置 package json,使用命令 $ npm init $ npm init 在根目录中(下面的文件只是一个包含所需模块的示例) 我们将开始配置本地测试,为此我们将按照下面的命令以编程方式设置代码以进行测试。 成功安装后,您可以使用描述的命令在本地检查单元测试并接收结果,例如: 太好了,它准备好了! 根据上述指南,您可以使用 parse server 测试运行器和为 back4app 开发的云代码功能。