答案:使用Jest编写js单元测试需先安装配置Jest,创建测试用例并使用test()定义测试,expect()结合toBe、toEqual等匹配器验证结果,支持分组describe()和生命周期钩子,通过jest.fn()或jest.spyOn()实现Mock模拟,确保函数行为符合预期。

编写JS单元测试的核心在于验证函数或模块的行为是否符合预期。使用Jest这个流行的javaScript测试框架,可以快速搭建测试环境并编写可维护的测试用例。下面介绍如何从零开始编写JS单元测试,并掌握常用测试方法。
安装与配置Jest
Jest是facebook推出的开箱即用的javascript测试框架,支持断言、Mock、覆盖率报告等功能。
在项目中初始化并安装Jest:
npm init -y
npm install –save-dev jest
修改package.json中的scripts字段:
“scripts”: {
“test”: “jest”
}
确保使用ES Module或CommonJS语法时配置正确。若使用ESM(import/export),需在package.json中添加:
“type”: “module”
或保持默认的CommonJS,使用require和module.exports。
编写第一个测试用例
假设有一个简单的数学工具函数add.js:
// add.js
export const add = (a, b) => a + b;
创建对应的测试文件add.test.js:
// add.test.js
import { add } from ‘./add’;
test(‘adds 1 + 2 to equal 3’, () => {
expect(add(1, 2)).toBe(3);
});
运行命令npm test即可看到测试结果。
Jest提供了多种测试函数:
- test() 或 it():定义一个测试用例
- describe():将相关测试分组
- beforeEach() 和 afterEach():设置测试前/后执行的逻辑
常用断言与匹配器
expect()配合匹配器(matchers)是Jest断言的核心。
常见匹配器包括:
- .toBe(value):严格相等(===)
- .toEqual(value):深度比较对象或数组
- .toBeDefined() / .toBeUndefined():检查是否已定义
- .toBeTruthy() / .toBeFalsy():布尔判断
- .toContain(item):数组或字符串包含某项
- .tothrow():检查函数是否抛出错误
例如测试异常情况:
const throwError = () => { throw new Error(‘Oops’) };
test(‘throws an error’, () => {
expect(throwError).toThrow(‘Oops’);
});
Mock函数与模块
Mock用于模拟函数行为或隔离外部依赖,便于专注测试目标逻辑。
比如有一个调用API的函数:
// api.js
export const fetchData = async (url) => {
const res = await fetch(url);
return res.json();
};
测试时不想真实请求网络,可以用jest.fn()创建Mock:
// api.test.js
jest.mock(‘./api.js’);
test(‘mocks fetch data’, async () => {
const mockFetch = jest.fn().mockResolvedValue({ data: ‘test’ });
global.fetch = mockFetch;
const result = await fetchData(‘/api’);
expect(result.data).toBe(‘test’);
expect(mockFetch).toHaveBeenCalled();
});
jest.spyOn()也可用于监听已有方法:
const spy = jest.spyOn(console, ‘log’);
expect(spy).toHaveBeenCalledWith(‘message’);
基本上就这些。Jest结合现代JavaScript语法能高效覆盖大部分测试场景。关键是写清晰的测试用例,保证函数行为稳定可靠。不复杂但容易忽略。