1. 引言

写了几个函数,怎么知道写得对不对呢?

可以通过测试函数,当然开发中测试的意义不只是这个

Jest是常用的JavaScript测试框架

官网为:Jest · Delightful JavaScript Testing (jestjs.io)

GitHub站点为:jestjs/jest: Delightful JavaScript Testing. (github.com)

本文描述快速使用Jest进行代码测试

2. 环境准备

安装:

npm install --save-dev jest

配置:

在项目的 package.json中添加测试命令:

{
// ...
"scripts": {
// ...
"test": "jest"
}
}

,配置完毕,不妨测试一下

新建一个JS文件并编写一个函数(sum.js):

function sum(a, b) {
return a + b;
} module.exports = sum;

新建一个JS测试文件并编写测试函数(sum.test.js):

const sum = require('./sum');

test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});

在console中执行命令npm run test

npm run test

> test
> jest PASS ./sum.test.js
√ adds 1 + 2 to equal 3 (5 ms) Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 0.615 s, estimated 1 s
Ran all test suites.

测试成功

更详细的描述可以参考官方的Quick Start:快速开始 · Jest (jestjs.io)

默认的配置如果不满足使用(如,需使用ES6语法、TypeScript等),需要进行配置

下面进行配置babel以实现ES6语法支持和TypeScript支持

安装:

npm install --save-dev babel-jest @babel/core @babel/preset-env @babel/preset-typescript ts-jest @types/jest

配置:

项目根目录下新建babel.config.js并写入配置:

module.exports = {
presets: [
['@babel/preset-env', {targets: {node: 'current'}}],
'@babel/preset-typescript',
],
};

这些配置参数均来自官方文档,使用时直接查阅即可

更为详细的配置项参考:快速开始 · Jest (jestjs.io)

3. 常用语法

3.1 常用匹配器

匹配器(matchers)就是将预期结果与测试结果比对,检测是否一致(匹配)

常用的匹配器有:

  • toBe
  • toEqual
  • toBeCloseTo
  • toMatch
  • toContain
  • toThrow

见字识义,根据函数名就可以推知其使用方法,如判断字符串匹配使用 toMatch 、判断数组是否包含使用toContain

test('字符串匹配', () => {
expect('team').toMatch('team');
});
// 测试通过 test('数组是否包含', () => {
expect(['a', 'b', 'c']).toContain('b');
});
// 测试通过

匹配器更为具体的使用方法参考:Expect 断言 · Jest (jestjs.io)

3.2 异步函数

测试异步函数,可以使用Promise.then(),也可以使用await\async

function fetchData(callback) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('异步函数返回值');
}, 1000);
});
} test('异步函数', () => {
return fetchData().then(data => {
expect(data).toBe('异步函数返回值');
});
});
// 测试通过 test('异步函数2', async () => {
const data = await fetchData();
expect(data).toBe('异步函数返回值');
}
);
// 测试通过

异步函数更为具体的使用方法参考:测试异步代码 · Jest (jestjs.io)

3.3 Hooks

Hooks可以理解为在一定时间触发的函数,比如测试函数执行前,测试函数执行后,常见的有:

  • beforeEach
  • afterEach
  • beforeAll
  • afterAll

见字识义,根据函数名就可以推知其使用方法,如在每个测试函数前触发的函数就是beforeEach

let a = null;
beforeEach(() => {
a = 1;
}); test('beforeEach', () => {
expect(a).toBe(1);
});
// 测试通过

Hooks更为具体的使用方法参考:安装和移除 · Jest (jestjs.io)

3.4 Mock

Mock即模拟,比如开发时后端没有提供数据,这时候难以测试接口函数,就可以使用Mock

下面主要模拟axios模块,并将axios.get()返回值设置为自定义的

import axios from 'axios';

function getUsers() {
return axios.get('/users.json').then(resp => resp.data);
} jest.mock('axios'); test('should fetch users', () => {
const users = [{name: 'Bob'}];
const resp = {data: users};
axios.get.mockResolvedValue(resp) return getUsers().then(data => expect(data).toEqual(users));
});

Mock更为具体的使用方法参考:模拟函数 · Jest (jestjs.io)

4. 参考资料

[1] 快速开始 · Jest (jestjs.io)

[2] jestjs/jest: Delightful JavaScript Testing. (github.com)

Jest快速使用指南的更多相关文章

  1. Rancher 快速上手指南操作(1)

    Rancher 快速上手指南操作(1)该指南知道用户如何快速的部署Rancher Server 管理容器.前提是假设你的机器已经安装好docker了.1 确认 docker 的版本,下面是 ubunt ...

  2. AngularJS快速入门指南20:快速参考

    thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...

  3. AngularJS快速入门指南19:示例代码

    本文给出的大部分示例都可以直接运行,通过点击运行按钮来查看结果,同时支持在线编辑代码. <div ng-app=""> <p>Name: <input ...

  4. AngularJS快速入门指南18:Application

    是时候创建一个真正的AngularJS单页面应用程序了(SPA). 一个AngularJS应用程序示例 你已经了解了足够多的内容来创建第一个AngularJS应用程序: My Note Save Cl ...

  5. AngularJS快速入门指南17:Includes

    使用AngularJS,你可以在HTML中包含其它的HTML文件. 在HTML中包含其它HTML文件? 当前的HTML文档还不支持该功能.不过W3C建议在后续的HTML版本中增加HTML import ...

  6. AngularJS快速入门指南16:Bootstrap

    thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...

  7. AngularJS快速入门指南15:API

    thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...

  8. AngularJS快速入门指南14:数据验证

    thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...

  9. AngularJS快速入门指南13:表单

    一个AngularJS表单是一组输入型控件的集合. HTML控件 HTML输入型标签标包括: input标签 select标签 button标签 textarea标签 HTML表单 HTML表单将各种 ...

  10. AngularJS快速入门指南12:模块

    AngularJS模块定义了一个application. 模块是一个application中不同部分的容器. application中的所有控制器都应该属于一个模块. 带有一个控制器的模块 下面这个a ...

随机推荐

  1. JS Leetcode 690. 员工的重要性 题解分析

    壹 ❀ 引 本题来自LeetCode690. 员工的重要性,难度简单,题目描述如下: 给定一个保存员工信息的数据结构,它包含了员工 唯一的 id ,重要度 和 直系下属的 id . 比如,员工 1 是 ...

  2. JS Leetcode 80. 删除有序数组中的重复项 II题解,常规解法与快慢双指针做法

    壹 ❀ 引 今天的题目来自LeetCode80. 删除有序数组中的重复项 II,是一道难度中等,但实际挺简单的一道题,题目描述如下: 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每 ...

  3. NC20960 迪拜的超市

    题目链接 题目 题目描述 forever97家住迪拜一环,因此有很多大大小小的商场. 迪拜一环有n个超市,分别在坐标轴[1,n]位置,forever97家在0这个位置. 由于日常开销巨大,所以Trot ...

  4. MySQL8.0使用mysqlsh配置主从复制 InnoDB ReplicaSet

    InnoDB ReplicaSet InnoDB ReplicaSet 由一个主节点和多个从节点构成. 可以使用ReplicaSet对象和AdminAPI操作管理复制集, 例如检查InnoDB复制集的 ...

  5. [技术选型与调研] 流程引擎(工作流引擎|BPM引擎):Activiti、Flowable、Camunda

    1 概述:流程与流程引擎 低代码平台.办公自动化(OA).BPM平台.工作流系统均需要[流程引擎]功能 BPM平台与工作流系统的区别,参见本文档:3.2 章节 流程引擎是任务分配软件(例如业务流程管理 ...

  6. SSIS数据同步系统

    缘起: 若干年前,刚到一家3C类的电商公司做DBA,到公司没几天,公司的CEO和研发总监,说现在要做个事情: 把IDC的数据库的数据,要同步一份到仓库,因单量大,仓库经常爆仓,仓库网络不好时,可以直接 ...

  7. MySQL的经典SQL优化12例(更新于2023年12月28日)

    下列优化的SQL案例,区别于平常加SQL索引的方法优化,大部分都是通过改写SQL语句方法优化,都是日常优化线上慢SQL的实际案例,有比较好的代表性(思路和方法),也是对自己这些年来做SQL优化的总结, ...

  8. mantis如何更改用户密码

    从MantisBT版本开始,创建用户后,必须由用户通过确认邮件进行修改密码,而管理员无权对用户的密码进行修改.这对于配置mail不成功的情况下很不方便.     以下配置就可以让管理员轻松管理用户的密 ...

  9. Spring Boot图书管理系统项目实战-10.借还统计

    导航: pre:  9.归还图书 next:11.检索图书 只挑重点的讲,具体的请看项目源码. 1.项目源码 需要源码的朋友,请捐赠任意金额后留下邮箱发送:) 2.页面设计 2.1 bookStat. ...

  10. Java Socket设置timeout几种常用方式总结

    原文链接:https://my.oschina.net/shipley/blog/715196 最近碰到读取第三方提供socket接口需要设置超时时间问题,特此记录一下.原文中有几处拼写错误顺便改掉了 ...