38 测试与调试 🕵️‍♂️之使用Jest进行测试

在前一章中,我们讨论了如何编写单元测试,了解了测试的重要性以及如何利用测试确保代码的正确性。在本章中,我们将深入探讨如何使用 Jest 进行测试。Jest 是一个流行的 JavaScript 测试框架,特别适合于测试 TypeScript 应用程序。无论是单元测试还是集成测试,Jest 都能够很好地满足我们的需求。

什么是Jest?

Jest 是一个零配置的 JavaScript 测试框架,由 Facebook 创建并维护。它具有快速、易于使用以及丰富的功能等优点。Jest 默认支持快照测试、异步测试和模拟等特性,使得我们可以更方便地进行全面的测试。

设置Jest

在开始之前,我们需要确保 Jest 已经安装并在项目中配置。我们可以通过以下命令来安装 Jest 和类型声明:

1
npm install --save-dev jest ts-jest @types/jest

接下来,我们需要在项目根目录下创建一个 jest.config.js 文件来配置 Jest:

1
2
3
4
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
};

这样我们就完成了对 Jest 的基础配置。

编写测试

假设我们有一个简单的 TypeScript 函数,用于计算两个数的和:

1
2
3
4
// src/math.ts
export function sum(a: number, b: number): number {
return a + b;
}

我们想要为这个函数编写测试。我们将创建一个新的测试文件 math.test.ts

1
2
3
4
5
6
7
8
9
10
11
12
// src/math.test.ts
import { sum } from './math';

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

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

运行测试

我们可以通过以下命令来运行 Jest 测试:

1
npx jest

如果一切正常,你将看到类似于以下的输出,表示测试通过:

1
2
3
4
5
6
7
8
9
10
 PASS  src/math.test.ts
sum function
✓ adds 1 + 2 to equal 3 (5ms)
✓ adds -1 + 1 to equal 0 (1ms)

Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 1.723s, estimated 2s
Ran all test suites.

测试异步代码

在现代应用程序中,异步代码是很常见的。Jest 对异步测试的支持也非常好。假设我们有一个函数,它从 API 获取数据:

1
2
3
4
5
6
// src/api.ts
export const fetchData = async (url: string): Promise<string> => {
const response = await fetch(url);
const data = await response.json();
return data.message;
};

我们可以为这个函数编写异步测试:

1
2
3
4
5
6
7
8
9
// src/api.test.ts
import { fetchData } from './api';

describe('fetchData function', () => {
test('fetches data from API', async () => {
const data = await fetchData('https://api.example.com/message');
expect(data).toBe('Hello, World!');
});
});

为了让这个测试通过,我们可能需要使用 Jest 的 mocking 功能,以避免对真实 API 的调用。我们可以这样设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// src/api.test.ts
import { fetchData } from './api';

global.fetch = jest.fn(() =>
Promise.resolve({
json: () => Promise.resolve({ message: 'Hello, World!' }),
})
);

describe('fetchData function', () => {
test('fetches data from API', async () => {
const data = await fetchData('https://api.example.com/message');
expect(data).toBe('Hello, World!');
});
});

快照测试

Jest 还支持快照测试,这是检查组件或对象序列化输出的一种强大方式。我们假设有一个函数返回一个用户对象:

1
2
3
4
// src/user.ts
export function createUser(name: string, age: number) {
return { name, age };
}

我们可以为它编写快照测试:

1
2
3
4
5
6
7
8
9
// src/user.test.ts
import { createUser } from './user';

describe('createUser function', () => {
test('creates a user object', () => {
const user = createUser('Alice', 30);
expect(user).toMatchSnapshot();
});
});

首次运行测试时,Jest 会生成一个快照文件以保存对象的结构。以后的测试运行将对比这个快照,确保输出未发生变化。

总结

通过本章的学习,我们掌握了如何使用 Jest 进行 TypeScript 应用程序的测试,包括单元测试、异步测试以及快照测试。通过编写高质量的测试,我们可以确保代码的可靠性,并在维护和扩展时保持信心。下一章将深入探讨调试技巧,帮助我们更有效地定位和解决问题。希望大家继续跟随我们的系列教程,提升 TypeScript 编程技能!

38 测试与调试 🕵️‍♂️之使用Jest进行测试

https://zglg.work/typescript-zero/38/

作者

IT教程网(郭震)

发布于

2024-09-14

更新于

2024-09-14

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论