加入收藏 | 设为首页 | 会员中心 | 我要投稿 湘西站长网 (https://www.0743zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 移动互联 > 应用 > 正文

如何用 Jest 和 SuperTest 来测试你的 Express

发布时间:2022-12-03 10:02:24 所属栏目:应用 来源:转载
导读: 原文: How to Test Your Express.js and Mongoose Apps with Jest and SuperTest,作者:Rakesh Potnuru
译者: luojiyin
测试是软件开发的重要组成部分应用程序包,越早进行越好。
在本文

原文: How to Test Your Express.js and Mongoose Apps with Jest and SuperTest,作者:Rakesh Potnuru

译者: luojiyin

测试是软件开发的重要组成部分应用程序包,越早进行越好。

在本文中,我将向你展示如何使用 Jest 和 Supertest 为你的 NodeJs/ExpressJS 和 MongoDB/Mongoose 应用程序编写测试。

开始

首先让我们做一个演示 Express.js 应用程序。

假设我们正在为电子商务应用程序构建一个后端 REST API。

这个应用程序:

Express.js 应用设置步骤一:Project 设置

首先,创建一个文件夹,用npm启动一个空白应用程序。

npm init

填写它所要求的所有细节。

然后,通过下面的命令,安装 express, mongoose, axios 和 dotenv:

npm i express mongoose axios dotenv

下面是我在 GitHub 上的package.json的一个链接。

步骤二:创建模板

让我们创建所有的文件夹和文件,然后用一些模板代码填充它们。

你的文件夹层次结构应该是这样的:

.
├── controllers
│   └── product.controller.js
├── models
│   └── product.model.js
├── routes
│   └── product.route.js
├── package-lock.json
├── package.json
├── .env
├── app.js
└── server.js

通过复制和粘贴来使用这些文件的代码。你要尽可能地分析代码和流程。

步骤三:数据库设置

我建议为一个项目使用两个数据库——一个用于测试,另一个用于开发。但对于学习来说,只用一个数据库就足够了。

首先,创建一个MongoDB账户或登录。

然后创建一个新的项目。给它起个名字,然后按 Next 按钮。

为项目命名

为项目命名

然后点击 Create Project。

我们必须在下面的窗口中通过选择一个云供应商、一个位置和规格来创建一个数据库。因此,按 Build a Database 就可以开始了。

创建一个数据库

创建一个数据库

选择 Shared,因为它足以满足学习目的。然后点击 Create。

选择部署选项

选择部署选项

接下来,选择 aws 作为你的云供应商,并选择离你最近的地区。在你选择之后,点击 Create Cluster。

该集群的形成将需要一些时间。在此同时,创建一个用户来访问你的数据库。

创建 Superuser 用户

创建 Superuser 用户

选择 “My Local Environment”,因为我们正在开发我们的应用程序。然后你可以添加一个 IP 地址。最后,点击Close。

添加 IP 地址

添加 IP 地址

数据库建立后,你会收到一个 URI 字符串,我们将用它来连接数据库。该字符串显示如下:

mongodb+srv://:@/?retryWrites=true&w=majority

把这个字符串放在.env文件中。

MONGODB_URI=your database string

现在我们准备开始测试我们的应用程序。

如何用 Jest 和 SuperTest 编写测试步骤一:安装 npm 包

你需要三个 npm 包来开始编写测试:jest、supertest 和cross-env。你可以像这样安装它们。

npm i jest supertest cross-env

Step 2: 添加测试命令

打开你的package.json文件,将测试命令添加到脚本中。

"scripts": {
    "test": "cross-env NODE_ENV=test jest --testTimeout=5000",
    "start": "node server.js",
    "dev": "nodemon server.js"
},

在这个案例中,我们使用cross-env来设置环境变量,jest来执行测试套件,testTimeout被设置为5000,因为某些请求可能需要一段时间才能完成。

步骤三:开始编写测试代码

首先,在应用程序的根目录下创建一个名为tests的文件夹,然后在那里创建一个名为product.test.js的文件。当你执行 npm run test 时,Jest 会在项目的根目录下搜索 tests 文件夹。因此,你必须将你的测试文件放在tests文件夹中。

接下来,在测试文件中导入supertest和mongoose包。

const mongoose = require("mongoose");
const request = require("supertest");

导入dotenv以加载环境变量,并导入app.js,因为那是我们的应用程序启动的地方。

const mongoose = require("mongoose");
const request = require("supertest");
const app = require("../app");
require("dotenv").config();

你需要在每次测试前连接数据库和测试后断开数据库(因为测试完成后我们不需要数据库)。

/* 在每次测试前连接到数据库。*/
beforeEach(async () => {
  await mongoose.connect(process.env.MONGODB_URI);
});
/* 每次测试后关闭数据库连接。*/
afterEach(async () => {
  await mongoose.connection.close();
});

现在你可以写你的第一个单元测试。

describe("GET /api/products", () => {
  it("should return all products", async () => {
    const res = await request(app).get("/api/products");
    expect(res.statusCode).toBe(200);
    expect(res.body.length).toBeGreaterThan(0);
  });
});

在上面的代码中,

你可以以同样的方式为所有的端点编写测试。

describe("GET /api/products/:id", () => {
  it("should return a product", async () => {
    const res = await request(app).get(
      "/api/products/6331abc9e9ececcc2d449e44"
    );
    expect(res.statusCode).toBe(200);
    expect(res.body.name).toBe("Product 1");
  });
});
describe("POST /api/products", () => {
  it("should create a product", async () => {
    const res = await request(app).post("/api/products").send({
      name: "Product 2",
      price: 1009,
      description: "Description 2",
    });
    expect(res.statusCode).toBe(201);
    expect(res.body.name).toBe("Product 2");
  });
});
describe("PUT /api/products/:id", () => {
  it("should update a product", async () => {
    const res = await request(app)
      .patch("/api/products/6331abc9e9ececcc2d449e44")
      .send({
        name: "Product 4",
        price: 104,
        description: "Description 4",
      });
    expect(res.statusCode).toBe(200);
    expect(res.body.price).toBe(104);
  });
});
describe("DELETE /api/products/:id", () => {
  it("should delete a product", async () => {
    const res = await request(app).delete(
      "/api/products/6331abc9e9ececcc2d449e44"
    );
    expect(res.statusCode).toBe(200);
  });
});

然后运行npm run test来运行测试套件(套件-测试文件)。

测试结果

测试结果

就是这些了!你现在知道如何用 Jest 和 SuperTest 来测试你的 Express/Mongoose 应用程序了。

现在去为你的应用程序创建新的测试吧!:)

如果你有任何问题,请随时在 Twitter 上给我留言。

(编辑:湘西站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!