首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用post、put、delete到firestore的多个端点对express http云函数进行单元测试?

要对使用Express HTTP云函数的多个端点(如POST、PUT、DELETE)进行单元测试,你需要模拟HTTP请求并验证响应。以下是一个完整的示例,展示如何使用Jest和Supertest来测试这些端点。

1. 安装依赖

首先,确保你已经安装了必要的依赖:

代码语言:txt
复制
npm install express jest supertest @google-cloud/firestore

2. 创建Express应用

假设你有一个简单的Express应用,使用Firestore作为数据库:

代码语言:txt
复制
// app.js
const express = require('express');
const Firestore = require('@google-cloud/firestore');

const app = express();
app.use(express.json());

const firestore = new Firestore();

app.post('/items', async (req, res) => {
  const { name } = req.body;
  const itemRef = firestore.collection('items').doc();
  await itemRef.set({ name });
  res.status(201).send({ id: itemRef.id, name });
});

app.put('/items/:id', async (req, res) => {
  const { id } = req.params;
  const { name } = req.body;
  const itemRef = firestore.collection('items').doc(id);
  await itemRef.update({ name });
  res.status(200).send({ id, name });
});

app.delete('/items/:id', async (req, res) => {
  const { id } = req.params;
  const itemRef = firestore.collection('items').doc(id);
  await itemRef.delete();
  res.status(204).send();
});

module.exports = app;

3. 编写单元测试

使用Jest和Supertest编写单元测试:

代码语言:txt
复制
// app.test.js
const request = require('supertest');
const app = require('./app');

describe('Firestore Endpoints', () => {
  it('should create a new item', async () => {
    const res = await request(app)
      .post('/items')
      .send({ name: 'Test Item' })
      .expect(201);
    expect(res.body).toHaveProperty('id');
    expect(res.body.name).toBe('Test Item');
  });

  it('should update an existing item', async () => {
    const createRes = await request(app)
      .post('/items')
      .send({ name: 'Test Item' })
      .expect(201);
    const id = createRes.body.id;

    const updateRes = await request(app)
      .put(`/items/${id}`)
      .send({ name: 'Updated Item' })
      .expect(200);
    expect(updateRes.body.name).toBe('Updated Item');
  });

  it('should delete an existing item', async () => {
    const createRes = await request(app)
      .post('/items')
      .send({ name: 'Test Item' })
      .expect(201);
    const id = createRes.body.id;

    const deleteRes = await request(app)
      .delete(`/items/${id}`)
      .expect(204);
  });
});

4. 运行测试

确保你的Firestore配置正确,然后运行测试:

代码语言:txt
复制
npx jest

5. 解决常见问题

问题:Firestore权限问题

原因:Firestore的安全规则可能阻止了测试请求。

解决方案:在测试环境中,可以暂时放宽Firestore的安全规则,或者使用测试专用的服务账户。

代码语言:txt
复制
// 在测试环境中放宽Firestore安全规则
const firestore = new Firestore({
  projectId: 'your-project-id',
  keyFilename: 'path/to/service-account-file.json',
  // 其他配置
});

问题:测试数据清理

原因:测试数据可能会污染数据库。

解决方案:在每个测试用例结束后清理测试数据。

代码语言:txt
复制
afterEach(async () => {
  const itemsRef = firestore.collection('items');
  await itemsRef.where('name', '==', 'Test Item').get().then((snapshot) => {
    snapshot.forEach(async (doc) => {
      await doc.ref.delete();
    });
  });
});

参考链接

通过以上步骤,你可以对Express HTTP云函数的多个端点进行单元测试,并解决常见的测试问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

实现前后端分离开发:构建现代化Web应用

API定义了前端如何与后端进行数据通信。通常,API使用RESTful风格,通过HTTP请求来实现。前端通过HTTP请求(如GET、POSTPUTDELETE)向后端请求数据和发送数据。.../123 DELETE请求删除用户: DELETE /api/users/123 定义清晰API有助于前后端团队理解如何与对方进行通信,以及如何处理请求和响应。...每个资源都有一个唯一URL,可以通过GET、POSTPUTDELETEHTTP方法进行操作。...构建后前端代码可以部署Web服务器、CDN或存储中。 后端代码也需要进行构建和部署,通常使用持续集成和持续部署(CI/CD)工具来实现自动化部署。 8....测试:前后端分离应用程序需要进行全面的测试,包括单元测试、集成测试和端端测试。自动化测试是确保应用程序质量关键。 部署策略:选择合适部署策略,考虑高可用性、负载均衡和容错性。

1K10

Vue.js + Node.js + Express + MySQL示例:构建全栈CRUD应用程序

全栈CRUD应用程序架构 我们将构建一个如下体系结构应用程序: ? Node.js Express导出REST API,并使用Sequelize ORM与MySQL数据库进行交互。...Vue客户端使用axios发送HTTP请求并获取HTTP响应,在组件中使用数据。 Vue路由器用于页面间导航。...GET api/tutorials/:id get Tutorial by id POST api/tutorials add new Tutorial PUT api/tutorials/:id update...http-common.js使用HTTP基准Url和请求头初始化axios. TutorialDataService中有用于发送HTTP请求Apis方法。...我们还介绍使用Express&Sequelize ORMREST API客户端-服务器体系结构,以及用于构建前端应用程序以发出HTTP请求和使用响应Vue.js项目结构。

25K21
  • REST API 最佳实践

    这是因为 HTTP 方法,例如 GET、POSTPUT、PATCH 和 DELETE,已经以动词形式执行基本 CRUD(创建、读取、更新、删除)操作。...GET、POSTPUT、PATCH 和 DELETE 是最常见 HTTP 动词。还有其他非 HTTP 标准动词,如 COPY、PURGE、LINK、UNLINK 等等。...3.在端点使用嵌套显示关系 很多时候,不同端点可以相互联系,所以你应该它们进行嵌套,这样更容易理解它们。...使用五种 HTTP 方法 POST,GET,PUT/PATCH,DELETE 可以提供 CRUD 功能(创建,获取,更新,删除)。 除了 POST 其他请求都具备幂等性(多次请求效果相同)。...PUT 和 PATCH 都是幂等。 删除:使用 DELETE 删除现有资源(幂等)。 简而言之,你应该让 HTTP 动词来处理端点工作。

    1.7K20

    Nest.js Controller 解析:探索路由和请求处理强大功能

    每个控制器 它会有多个路由,不同路由对应不同业务请求处理。在 Nest  中, 创建一个 控制器,应该使用类 和 装饰器 , 装饰器会使类相关联数据关联起来,将请求绑定相应控制器。...路由 形成 :控制器装饰器前缀@Controller('user')  +  请求方法装饰器结合 @Get('getDeatil')将形成路由映射user/getDeatail如何进行路由分组呢?...通过 HTTP 请求方法装饰器  修饰方法,它会方法告诉 Nest 为 HTTP 请求特定端点创建处理程序。栗子中,getUserInfo  方法被 @Get 所修饰,所以它是一个 Get 请求。...1.3.2 请求参数装饰器通过客户端发起请求参数做解析处理,Nest 提供访问请求对象 默认方式为 express .Nest express...方法提供装饰器:@Get(),  @Post(),  @Put(),  @Delete(),  @Patch(),  @Options(), 和 @Head().

    52350

    基于Node.jsExpress框架

    下一个中间件函数通常由名为 next 变量来表示。 中间件函数可以执行以下任务 执行任何代码。 请求和响应对象进行更改。 结束请求/响应循环。...() 函数将应用层中间件绑定应用程序对象实例,其中 METHOD 是中间件函数处理请求小写 HTTP 方法(例如 GET、PUTPOST),更多查看官方文档。...Express 支持对应于 HTTP 方法以下路由方法:get、postput、head、delete、options、trace、copy、lock、mkcol、move、purge、propfind...路由处理程序您可以提供多个回调函数,以类似于中间件行为方式来处理请求。唯一例外是这些回调函数可能调用 next('route') 来绕过剩余路由回调。...; }); 多个回调函数可以处理一个路由(确保您指定 next 对象)。

    5.5K20

    Express-路由篇

    路由 接触到一个新框架时,首先要了解就是路由,路由是指应用程序端点 (URI) 如何响应客户端请求,简单来讲就是定义通过什么路径来访问各个服务,每个路由可以有一个或多个处理函数,当路由匹配时执行。...()); // JSON格式处理数据 使用 urlencoded处理数据 有效负载解析传入请求, 是express 基于body-parser 内置中间件 此选项允许在使用querystring库...,用浏览器 打开http://localhost:3000 查看项目 可以看到之前Express 换成了 Hello Word!...}); }); module.exports = router; 其他请求方式路由 另外几个请求方式 就是 POST PUT DELETE 也很简单,直接使用方式如下 POST 请求方式 router.post...express 就提供一个很好工具 ,叫中间件,简单来说 中间件就是一些处理方法合集,使用起来很简单,一个关键点就是 就是上文路由方法中 next,下面是 简单模拟例子 router.get('/

    9910

    解释 RESTful API,以及如何使用它构建 web 应用程序。

    每个资源都有唯一URL。 动词(Verbs):RESTful API使用HTTP动词(GET、POSTPUTDELETE等)资源进行操作。...例如,使用GET方法获取资源,使用POST方法创建新资源。 表示(Representation):资源以某种特定表示形式(如JSON、XML)进行传输。...设计HTTP方法:确定每个资源对应HTTP方法(GET、POSTPUTDELETE等)。 设计数据表示:选择合适数据格式(如JSON、XML)来表示数据。...实现API端点使用Web框架(如Express、Django)实现API端点,处理HTTP请求和响应。 鉴权和权限控制:根据应用程序需要,实现用户鉴权和权限控制。...部署和发布:将API部署服务器,通过APIURL地址进行访问和使用使用RESTful API构建Web应用程序可以提供灵活性和可扩展性。

    8800

    NodeJS背后的人:Express

    Express路由: 路由是网络通信中一个核心概念:确保数据包能够以最有效方式从源到达目的地; Express路由: 确定了应用程序如何响应客户端特定端点请求,每个路由可以有一个或多个回调处理函数...,当路由匹配时执行; 路由组成: 端点是:URI/路径+特定HTTP请求方法(GET\POST......:GET、POSTPUTDELETE ··· (PATH,Handler):PATH定义匹配路由路径,Handler 路由匹配时执行回调函数:(请求对象req,响应对象res)=>{} //多种路由规则...Express进行了封装更方便获取请求报文中数据:并兼容原生HTTP模块获取方式: //定义服务路由: //假设请求 URL: http://127.0.0.1:5400/request?...}); }) Express 中间件 Express 中间件本质是一个回调函数Middleware 主要目的是处理 HTTP 请求,请求进行预处理、执行一些操作,将请求next 传递——》下一个中间件或路由处理程序

    11810

    13 个设计 REST API 最佳实践

    但是,就 REST API 设计本身而言,所涉及 HTTP 知识要点大概包含以下几条: HTTP 中包含动词(或方法): GET、POSTPUT、PATCH 还有 DELETE 是最常用。...一个端点可以被解释为某种资源进行某个动作。比如, POST: /articles 可能代表“创建一个新 article”。...在业务领域,我们常常可以将动词和 CRUD(增删查改)关联起来:GET 代表查,POST代表增,PUT 和 PATCH 代表改(注: PUT 通常代表整体更新,而 PATCH 代表局部更新),而 DELETE...这一点于程序化客户端尤为重要(比如通过 python requests 模块来与 api 进行交互)—— 这些程序是否返回数据进行正确解码取决于这个头部。...下面是我推荐与动词相对应状态码: GET: 200 OK POST: 201 Created PUT: 200 OK PATCH: 200 OK DELETE: 204 No Content

    3.6K20

    使用nodejs和express搭建http web服务

    虽然nodejs已经带有http处理模块,但是对于现代web应用程序来说,这或许还不太够,于是我们有了express框架,来nodejs内容进行扩展。...但是我们有时候也需要从nodejs后端服务中调用第三方应用http接口,下面的例子将会展示如何使用nodejs来调用http服务。...同样PUTDELETE 也可以使用同样方式来调用。...,我们将接受到值push一个数组里面,等所有的值都接收完毕,触发end事件时候,再统一进行输出。...express路由 有了web服务,我们需要对不同请求路径和请求方式进行不同处理,这时候就需要使用到了express路由功能: // 网站首页访问返回 "Hello World!"

    1.9K31

    使用nodejs和express搭建http web服务

    虽然nodejs已经带有http处理模块,但是对于现代web应用程序来说,这或许还不太够,于是我们有了express框架,来nodejs内容进行扩展。...但是我们有时候也需要从nodejs后端服务中调用第三方应用http接口,下面的例子将会展示如何使用nodejs来调用http服务。...同样PUTDELETE 也可以使用同样方式来调用。...,我们将接受到值push一个数组里面,等所有的值都接收完毕,触发end事件时候,再统一进行输出。...express路由 有了web服务,我们需要对不同请求路径和请求方式进行不同处理,这时候就需要使用到了express路由功能: // 网站首页访问返回 "Hello World!"

    2.7K40

    什么是REST API

    REST API是两个计算机系统在web浏览器和服务器中使用HTTP技术进行通信一种方式。 在两个或多个系统之间共享数据一直是软件开发一个基本要求。比如说,考虑购买汽车保险。...不同HTTP方法可以在任何端点使用,这些方法映射到应用程序创建、读取、更新和删除(CRUD)操作: HTTP方法CRUD行为GET读取返回请求数据POST创建创建一个新记录PUT 或者 PATCH.../user/POST请求使用body对象创建了一个ID为123用户。该响应会返回ID。 /user/123PUT请求使用body对象更新用户123。...端点URL、HTTP方法、body对象和响应类型可以随心所欲地实现。例如,POSTPUT和PATCH通常可以互换使用,如有必要任何一个都可以用来创建或更新记录。...Hello World示例 下面的Node.js代码使用Express框架创建了一个RESTful网络服务。一个单一/hello/端点HTTP GET请求作出响应。

    4.3K20

    REST API 设计最佳实践:如何构建、设计和使用 API ?

    (操作或方法):最常见是GET、POSTPUT、PATCH和DELETE。...高一层次来看,动词映射到CRUD操作:GET表示读取,POST表示创建,PUT和PATCH表示更新,DELETE表示删除 响应状态由其状态码指定:1xx 表示信息, 2xx 表示成功, 3xx 表示重定向...例如,如果你选择某个POST端点返回201 Created,那么对于每个POST端点都应使用相同HTTP状态码。为什么?因为消费者不应该担心在哪种情况下哪个方法在哪个端点上会返回哪个状态码。...通常,我遵循以下模式: GET: 200 OK PUT: 200 OK POST: 201 Created PATCH: 200 OK DELETE: 204 No Content 8....最简单类型分页就是按页码进行分页,它由page和page size确定。现在问题来了:如何将这样功能融入REST API? 我答案是:使用查询字符串(querystring)。

    42340

    推荐一个基于 Node.js 表单验证库

    在本文中,我想向你展示如何为你数据添加防弹验证,同时返回风格良好格式。 在 Node.js 中进行自定义数据验证既不容易也不快。 为了覆盖所有类型数据,需要写许多函数。...一个基本Node.js表单验证案例 假设你 API 中有一个 Koa 或 Express Web 写服务和一个端点,用于在数据库中创建包含多个字段用户数据。...很酷,吧? `PUT`/`PATCH` 在使用 PUT/PATCH (或 POST)更新数据时,你不必重写所有逻辑、规则和过滤器。...使用两个简单中间件,我们可以为所有 POST/PUT/PATCH 方法编写大多数逻辑。 userEditMiddleware() 函数验证我们要编辑记录是否存在,否则便抛出错误。...然后 userValidator() 所有端点进行验证。 最后 .patch() 过滤器将删除 .form 对象中任何字段(如果其未定义)或者假如请求方法是 PATCH 的话。

    2.7K40

    FaaS 简单实践

    触发器可以是一个特定事件,也可以是API 管理系统请求,然后将该代码作为API 端点公开。...每个资源都可以支持一个或多个方法(GET,POSTput/ patch,DELETE) ,这些方法通过Actions > Create Method来添加。...这个资源将在路径(post ID)中有一个参数,可以通过将参数名包装为"/posts / { post ID }"括号来实现。创建资源后,将GET、 PUTDELETE 方法添加到其中。...然而,这里是为了演示目的。可以考虑使用 Firehose 作为从物联网 S3/reshift 和 EMR 集群传输流来进行数据处理,但对于这个简单实践而言,这里只是一个临时做法。...另一方面,如果正在构建一个与无关、高度可定制解决方案,并且使用实时数据进行操作,可以考虑使用自定义或开源物联网解决方案。

    3.6K20

    【axios】使用json-server 搭建REST API

    (2) 同一个请求路径可以进行多个操作 (3) 请求方式会用到GET/POST/PUT/DELETE 非REST API: restless (1) 请求方式不决定请求CRUD 操作 (2) 一个请求路径只对应一个操作...XHR ajax 封装 (简单版axios) 2.1 特点 函数返回值为promise, 成功结果为response, 失败结果为error 能处理多种类型请求: GET/POST/PUT/...DELETE 函数参数为一个配置对象 { url: '', // 请求地址 method: '', // 请求方式GET/POST/PUT/DELETE params: {}, // GET/DELETE...(1) 需求: 项目中有部分接口需要配置与另一部分接口需要配置不太一样, 如何处理(比如有多个baseURL需要指定) (2) 解决: 创建2 个新axios, 每个都有自己特有的配置, 分别应用到不同要求接口请求中...= express() // 使用cors, 允许跨域 app.use(cors()) // 能解析urlencode格式post请求体参数 app.use(express.urlencoded()

    2.8K00
    领券