ts-jest 用于 TypeScript:完整指南及示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

什么是 ts-jest 以及为什么需要它?



ts-jest 是流行测试框架 Jest 的一个 TypeScript 预处理器。它允许您运行用 TypeScript 编写的测试,而无需预先编译成 JavaScript。该库在测试执行期间使用内置的 TypeScript 编译器自动将 TypeScript 代码转换为 JavaScript。



ts-jest 的主要目标是实现 TypeScript 与 Jest 的无缝集成。如果没有它,您将不得不在每次运行测试之前手动配置 TypeScript 编译,或者使用像 ts-node 这样的额外工具。ts-jest 使这个过程变得透明且自动化。



使用 ts-jest 的关键优势:

  • 自动编译 — TypeScript 文件在测试期间“即时”编译
  • 完全支持 TypeScript — 所有语言特性(装饰器、泛型、类型)都能正常工作
  • Source maps — 出错时您看到的是原始 TypeScript 代码,而不是编译后的 JavaScript
  • 性能 — ts-jest 缓存编译结果,从而加快后续运行速度
  • 灵活性 — 您可以通过 Jest 配置来调整 TypeScript 编译器选项


安装 ts-jest



要使用 ts-jest,您需要 Node.js(版本 14 或更高)以及 npm 或 yarn 包管理器。安装只需一条命令:



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


或者通过 yarn:



yarn add --dev jest typescript ts-jest @types/jest


包说明:

  • jest — 测试框架本身
  • typescript — TypeScript 编译器
  • ts-jest — 用于集成的预处理器
  • @types/jest — Jest 的 TypeScript 类型(用于自动补全和类型检查)


安装后,您需要创建或更新 jest.config.js(或 jest.config.ts)文件:



// jest.config.jsmodule.exports = {  preset: 'ts-jest',  testEnvironment: 'node',  roots: ['<rootDir>/src'],  testMatch: ['**/__tests__/**/*.ts?(x)', '**/?(*.)+(spec|test).ts?(x)'],  moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node']};


同时确保在 tsconfig.json 中配置了正确的选项:



{  "compilerOptions": {    "target": "ES2020",    "module": "commonjs",    "strict": true,    "esModuleInterop": true,    "skipLibCheck": true,    "forceConsistentCasingInFileNames": true,    "outDir": "./dist",    "rootDir": "./src",    "declaration": true,    "sourceMap": true  },  "include": ["src/**/*"],  "exclude": ["node_modules", "dist", "**/*.test.ts"]}


快速入门及代码示例



让我们创建一个简单的函数及其测试。项目结构:



my-project/├── src/│   ├── math.ts│   └── __tests__/│       └── math.test.ts├── jest.config.js├── tsconfig.json└── package.json


文件:src/math.ts



export function add(a: number, b: number): number {  return a + b;}

export function subtract(a: number, b: number): number { return a - b;}

export function multiply(a: number, b: number): number { return a * b;}

export function divide(a: number, b: number): number { if (b === 0) { throw new Error('Division by zero'); } return a / b;}


文件:src/__tests__/math.test.ts



import { add, subtract, multiply, divide } from '../math';

describe('Math functions', () => { test('adds 1 + 2 to equal 3', () => { expect(add(1, 2)).toBe(3)

推荐