Jest 测试框架:构建可靠的测试体系

Jest 测试框架:构建可靠的测试体系

什么是 Jest?

Jest 是 Facebook 开发的 JavaScript 测试框架,具有简洁的 API 和强大的功能。

Jest 的特点

特性 说明
零配置 开箱即用
快照测试 自动生成和比对快照
代码覆盖率 内置覆盖率报告
Mock 功能 强大的 mocking 能力

基础测试

javascript 复制代码
// sum.js
function sum(a, b) {
  return a + b;
}
module.exports = sum;

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

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

匹配器

javascript 复制代码
test('常见匹配器', () => {
  // 相等性
  expect(2 + 2).toBe(4);
  expect({ name: 'John' }).toEqual({ name: 'John' });
  
  // 真值
  expect(null).toBeNull();
  expect(undefined).toBeUndefined();
  expect(1).toBeTruthy();
  
  // 数字
  expect(2).toBeGreaterThan(1);
  expect(1).toBeLessThan(2);
  
  // 字符串
  expect('hello').toMatch(/ello/);
  
  // 数组
  expect([1, 2, 3]).toContain(2);
});

异步测试

javascript 复制代码
// Promise
test('异步测试 - Promise', () => {
  expect.assertions(1);
  return fetchData().then(data => {
    expect(data).toBe('peanut butter');
  });
});

// Async/Await
test('异步测试 - Async/Await', async () => {
  expect.assertions(1);
  const data = await fetchData();
  expect(data).toBe('peanut butter');
});

Mock 函数

javascript 复制代码
const mockFn = jest.fn();

mockFn('hello');
expect(mockFn).toHaveBeenCalled();
expect(mockFn).toHaveBeenCalledWith('hello');

// Mock 返回值
const mockReturn = jest.fn().mockReturnValue('mocked value');
expect(mockReturn()).toBe('mocked value');

Mock 模块

javascript 复制代码
// __mocks__/axios.js
module.exports = {
  get: jest.fn().mockResolvedValue({ data: 'mocked data' })
};

// api.test.js
jest.mock('axios');
const axios = require('axios');

test('mock 模块', async () => {
  await fetchData();
  expect(axios.get).toHaveBeenCalledWith('/api/data');
});

快照测试

javascript 复制代码
test('快照测试', () => {
  const component = renderer.create(<Button />).toJSON();
  expect(component).toMatchSnapshot();
});

测试配置

javascript 复制代码
// jest.config.js
module.exports = {
  testEnvironment: 'jsdom',
  moduleNameMapper: {
    '\\.(css|less)$': '<rootDir>/__mocks__/styleMock.js'
  },
  setupFilesAfterEnv: ['<rootDir>/setupTests.js'],
  coverageThreshold: {
    global: {
      branches: 80,
      functions: 80,
      lines: 80,
      statements: 80
    }
  }
};

测试钩子

javascript 复制代码
beforeAll(() => {
  console.log('所有测试开始前');
});

beforeEach(() => {
  console.log('每个测试开始前');
});

afterEach(() => {
  console.log('每个测试结束后');
});

afterAll(() => {
  console.log('所有测试结束后');
});

代码覆盖率

bash 复制代码
# 生成覆盖率报告
npx jest --coverage

# 查看覆盖率报告
open coverage/lcov-report/index.html

实战案例

javascript 复制代码
// userService.test.js
const UserService = require('./userService');

describe('UserService', () => {
  let service;
  
  beforeEach(() => {
    service = new UserService();
  });
  
  describe('getUser', () => {
    it('应该返回用户信息', async () => {
      const user = await service.getUser(1);
      expect(user.id).toBe(1);
      expect(user.name).toBe('John');
    });
    
    it('应该抛出错误当用户不存在', async () => {
      await expect(service.getUser(999)).rejects.toThrow('User not found');
    });
  });
});

总结

Jest 是一个功能强大的测试框架:

  1. 易于使用:简洁的 API
  2. 功能丰富:快照、mock、覆盖率
  3. 生态完善:与 React、Vue 等框架无缝集成
  4. 社区活跃:大量插件和资源

编写高质量的测试,让你的代码更加可靠。

相关推荐
听风吹等浪起37 分钟前
第30章:MobileNetV3全家桶实现MRI脑肿瘤四分类(含Streamlit网页推理+Mermaid结构图)
人工智能·分类·数据挖掘
如若1231 小时前
TRACER 论文解读与复现:面向 ICU 长时程患者监测的多模态 Harness 架构、时序证据建模与工具增强推理
人工智能·深度学习·计算机视觉
深蓝AI3 小时前
无头浏览器不必从 Chrome 改:Lightpanda 用 Zig 从零造,100 个页面只占 123MB 内存
人工智能·程序员
奈落245 小时前
AI辅助的另一面:从2026年国际AI安全报告的“故障”清单到国内专家的可靠性短板,自主行动的Agent为什么更难及时干预
人工智能·安全·agent·本地部署·ai 办公
火山引擎开发者社区7 小时前
eMudhra 证书失陷:容器用户最容易忽略的镜像信任链漏洞
人工智能
LabVIEW开发8 小时前
LabVIEW 机载 DIAL:每秒万次甲烷测量
人工智能·labview·labview知识·labview功能·labview程序
飞猫的边缘AI8 小时前
英特尔量子生意
人工智能·量子计算·边缘ai
深蓝AI9 小时前
桌面 Agent 缺的不是视觉:Vercel 开源 agent-desktop,用无障碍树 ref 替代截图坐标
人工智能·程序员
镜子AI9 小时前
镜子AI 技术复盘:三条自动化链路上的“停止条件“设计
运维·人工智能·自动化
向哆哆9 小时前
羊行为目标检测数据集:4类别、2,000张图像 | 目标检测
人工智能·yolo·目标检测·目标跟踪