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. HBase Shell将命令执行结果导出到文件

    1.将Hbase shell执行结果输出到文件 echo "scan 'test'" | hbase shell>my.txt 2.查看表的region数 list_regi ...

  2. jvm的简介

    什么是jvm? java虚拟机就是二进制字节码的运行环境.我们可以把jvm看做是运行在不同系统上的一个软件应用的计算机,就比如说我们要打开图片,就得用看图软件,或者我们要对文件进行解压,是不是得用解压 ...

  3. Mysql一张表可以存储多少数据

    Mysql一张表可以存储多少数据 在操作系统中,我们知道为了跟磁盘交互,内存也是分页的,一页大小4KB.同样的在MySQL中为了提高吞吐率,数据也是分页的,不过MySQL的数据页大小是16KB.(确切 ...

  4. Golang gRPC学习(05): retry重试

    什么是重试 如果服务出现了错误,主要是网络,服务器出现了短暂异常的时候,该怎么办? 我们都会人工或者自动的重新连接服务试试,看服务是否恢复可用了. 这种重新进行连接服务的一种方式就是重试.如果是在微服 ...

  5. 【笔记】css —— BFC 原理

    一.什么是 BFC BFC 即 Block Formatting Contexts (块级格式化上下文),具有 BFC 特性的元素可以看作是隔离了的独立容器,容器里面的元素不会在布局上影响到外面的元素 ...

  6. Vue3学习(二十)- 富文本插件wangeditor的使用

    写在前面 学习.写作.工作.生活,都跟心情有很大关系,甚至有时候我更喜欢一个人独处,戴上耳机coding的感觉. 明显现在的心情,比中午和上午好多了,心情超棒的,靠自己解决了两个问题: 新增的时候点击 ...

  7. 01、etcd基础介绍

    互联网技术发展真的快,层出不穷的新技术.最近项目使用到了etcd,自己之前在部署k8s集群的时候玩过,但是并没有系统的学习.正好趁这个机会,系统性的学习下.文章中的内容有些是来自官方文档,有些是来自网 ...

  8. 【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误

    问题描述 PHP应用突然遇见了500 The page cannot be displayed because an internal server error has occurred.错误,但是如 ...

  9. Mysql跟Redis区别?

    1. MySQL是关系型数据库:而Redis是非关系型数据库. 2.MySQL用于持久化存储数据到硬盘,功能强大,但是速度缓慢:而Redis用于存储使用较为频繁的数据到缓存中,读取速度快. 3.MyS ...

  10. Java 继承成员变量和继承方法的区别

    1 package com.bytezreo.duotai3; 2 3 /** 4 * 5 * @Description 继承成员变量和继承方法的区别 6 * @author Bytezero·zhe ...