【node.js】学习篇:jest单元测试

【node.js】学习篇:jest单元测试

单元测试以及其意义

  • 单个功能或接口,给定输入,得到输出。看输出是否符合要求;

  • 需要手动编写测试用例,然后统一执行;

  • 意义:能一次性执行所有单元测试,短时间内验证所有功能是否正常。

如何在koa2项目中使用jest

  • 文件后缀必须是 *.test.js 只有这类文件层能被使用

  • 常用的断言

  • 测试http接口

下载 jest 依赖

npm i jest --save-dev 

配置 package.json

--runInBand 在当前进程中连续运行所有测试,也就是 一个一个来不要拥挤。

--forceExit 在所有测试完成运行后强制 Jest 退出。

--colors 测试结果输出突出显示。

更多启动配置可以查看官方文档

...
"scripts": {
    "start": "node bin/www",
    "dev": "cross-env NODE_ENV=dev ./node_modules/.bin/nodemon bin/www",
    "prd": "cross-env NODE_ENV=production pm2 start bin/www",
   + "test": "cross-env NODE_ENV=test jest --runInBand --forceExit --colors"
  },
...

简单的使用

我们在 src 目录下新建一个 test 文件夹,然后在 test 文件夹下新建 demo.test.js 文件,编写如下代码:

/**
 * @description test demo
 * @author mosaic
 */

const sum = (a, b) => a + b

test('10 + 20 is 30', () => {
  const res = sum(10, 20)
  expect(res).toBe(30)
})

随后使用 npm run test 运行项目

> deep-search-backend@0.1.0 test /Users/mosaic/Desktop/projectFolder/my.nosync/BackendDemo/search-backend
> cross-env NODE_ENV=test jest --runInBand --forceExit --colors

 PASS  src/test/demo.test.js
  ✓ 10 + 20 is 30 (1 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.306 s
Ran all test suites.
Force exiting Jest: Have you considered using `--detectOpenHandles` to detect async operations that kept running after all tests finished?

可以看到测试用例正常通过!!!

测试 HTTP 接口

首先需要先为项目安装一个 supertest 插件;

npm i supertest --save-dev

随后我们就可以在 test 文件夹下新建 server.js 文件,编写如下代码:

这一步,是为让我们的测试用例能正常的向服务器发送请求。

/**
 * @description 为测试用例 启动 server 发送请求
 * @author mosaic
 */

const request = require('supertest')
const server = require('../app').callback()

module.exports = request(server)

然后,在同样的目录下,新建一个 json.test.js 的测试用例文件,写入如下代码:

/**
 * @description json路由的测试用例
 * @author mosaic
 */

const server = require('./server')

// 网络接口相关的测试用例 要注意使用异步操作
test('json 接口返回数据格式测试', async () => {
  const res = await server.get('/json')
  // toEqual 用来断言对象是否相等;toBe 用来断言值是否相等 
  expect(res.body).toEqual({
    title: 'koa2 json',
    viewNum: 1
  })
})

这段代码运行的时候,会向 /json路径发送请求,随后拿到反悔的值,再将该值与测试用例的值做比对;

> deep-search-backend@0.1.0 test /Users/mosaic/Desktop/projectFolder/my.nosync/BackendDemo/search-backend
> cross-env NODE_ENV=test jest --runInBand --forceExit --colors

 PASS  src/test/json.test.js
  ● Console

    console.log
        <-- GET /json

      at printFunc (node_modules/koa-logger/index.js:52:17)

    console.log
        --> GET /json 200 9ms 33b

      at printFunc (node_modules/koa-logger/index.js:52:17)

 PASS  src/test/demo.test.js

Test Suites: 2 passed, 2 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        0.734 s, estimated 1 s
Ran all test suites.
Force exiting Jest: Have you considered using `--detectOpenHandles` to detect async operations that kept running after all tests finished?

可以看到这里发送请求并且成功通过了测试用例。

上面演示的是get请求,如果是post请求,我们就需要项目服务器send相应的数据,然后再根据需要对返回的数据进行相应的断言即可!

/**
 * @description json路由的测试用例
 * @author mosaic
 */

const server = require('./server')

// 网络接口相关的测试用例 要注意使用异步操作
test('json 接口返回数据格式测试', async () => {
  const res = await server.post('/json').send({
    pasword:123
  })
  ...
})
posted @   捡破烂的小z  阅读(623)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示