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

1.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 ORM的REST API的客户端-服务器体系结构,以及用于构建前端应用程序以发出HTTP请求和使用响应的Vue.js项目结构。

25K21
  • REST API 最佳实践

    这是因为 HTTP 方法,例如 GET、POST、PUT、PATCH 和 DELETE,已经以动词形式执行基本的 CRUD(创建、读取、更新、删除)操作。...GET、POST、PUT、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().

    54650

    基于Node.js的Express框架

    下一个中间件函数通常由名为 next 的变量来表示。 中间件函数可以执行以下任务 执行任何代码。 对请求和响应对象进行更改。 结束请求/响应循环。...() 函数将应用层中间件绑定到应用程序对象的实例,其中 METHOD 是中间件函数处理的请求的小写 HTTP 方法(例如 GET、PUT 或 POST),更多查看官方文档。...Express 支持对应于 HTTP 方法的以下路由方法:get、post、put、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('/

    10610

    【Web前端】Web API:构建Web应用核心

    API 如何工作 基于对象的 API 现代 API 通常采用面向对象的设计,使得功能更加模块化、易于使用和扩展。通过将相关的功能组织到一个对象中,开发者可以方便地调用该对象的方法来实现特定的操作。...这种结构化的设计使得开发者能够清晰地理解和使用 API,便于进行数据请求、操作和管理。 1、API 端点 在 RESTful API 中,端点是客户端与服务器之间交互的具体路径。...如何定义多个 API 端点,并且使用 JavaScript 对这些端点进行组织: const apiEndpoints = { getUsers: "/api/users", // 获取所有用户...POST:创建新的资源(如添加新数据)。 PUT/PATCH:更新现有资源(如修改已有数据)。 DELETE:删除资源(如移除不再需要的数据)。...可以看到 ​​fetch​​ 函数如何使用不同的方法来调用相应的 API 端点。

    15610

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

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

    10000

    NodeJS背后的人:Express

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

    13410

    13 个设计 REST API 的最佳实践

    但是,就 REST API 设计本身而言,所涉及到的 HTTP 知识要点大概包含以下几条: HTTP 中包含动词(或方法): GET、POST、PUT、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

    什么是REST API

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

    4.3K20

    使用nodejs和express搭建http web服务

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

    1.9K31

    使用nodejs和express搭建http web服务

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

    2.7K40

    推荐一个基于 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

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

    (操作或方法):最常见的是GET、POST、PUT、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)。

    45340

    FaaS 的简单实践

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

    3.6K20
    领券