logo
  • 指南
  • 配置
  • 插件
  • API
  • 示例
  • 社区
  • Modern.js 2.x 文档
  • 简体中文
    • 简体中文
    • English
    • 开始
      介绍
      快速上手
      版本升级
      名词解释
      技术栈
      核心概念
      页面入口
      构建工具
      Web 服务器
      基础功能
      路由
      路由基础
      配置式路由
      数据管理
      数据获取
      数据写入
      数据缓存
      渲染
      服务端渲染(SSR)
      服务端流式渲染(Streaming SSR)
      渲染缓存
      静态站点生成(SSG)
      渲染预处理 (Render Preprocessing)
      样式开发
      引入 CSS
      使用 CSS Modules
      使用 CSS-in-JS
      使用 Tailwind CSS
      HTML 模板
      引用静态资源
      引用 JSON 文件
      引用 SVG 资源
      引用 Wasm 资源
      调试
      数据模拟(Mock)
      网络代理
      使用 Rsdoctor
      使用 Storybook
      测试
      Playwright
      Vitest
      Jest
      Cypress
      路径别名
      环境变量
      构建产物目录
      部署应用
      进阶功能
      使用 Rspack
      使用 BFF
      基础用法
      运行时框架
      扩展 BFF Server
      扩展一体化调用 SDK
      文件上传
      跨项目调用
      优化页面性能
      代码分割
      静态资源内联
      产物体积优化
      React Compiler
      提升构建性能
      浏览器兼容性
      配置底层工具
      源码构建模式
      服务端监控
      Monitors
      日志事件
      指标事件
      国际化
      基础概念
      快速开始
      配置说明
      语言检测
      资源加载
      路由集成
      API 参考
      高级用法
      最佳实践
      自定义 Web Server
      专题详解
      模块联邦
      简介
      开始使用
      应用级别模块
      服务端渲染
      部署
      集成国际化能力
      常见问题
      依赖安装问题
      命令行问题
      构建相关问题
      热更新问题
      已下线功能
      📝 编辑此页面
      上一页Vitest下一页Cypress

      #Jest

      Jest 是一个 JavaScript 测试框架,它主要和 React Testing Library 一起用于单元测试和 Snapshot 测试。

      在 Modern.js 中使用 Jest 需要先安装依赖,可以执行以下命令:

      npm
      yarn
      pnpm
      npm install -D jest jest-environment-jsdom @testing-library/react @testing-library/dom @testing-library/jest-dom
      yarn add -D jest jest-environment-jsdom @testing-library/react @testing-library/dom @testing-library/jest-dom
      pnpm install -D jest jest-environment-jsdom @testing-library/react @testing-library/dom @testing-library/jest-dom

      随后,你可以运行以下命令,这将自动在项目中初始化 Jets,并生成一个基础的 jest.config.[jt]s 配置:

      npm
      yarn
      pnpm
      npm init jest@latest
      yarn create jest@latest
      pnpm create jest@latest

      #配置文件

      Note

      本章节会使用 .ts 文件来完成 Jest 测试。

      相比于其他的测试框架,Jest 在构建层面需要更多的配置,例如处理 JSX 和 ESM 语法,因此首先需要安装一些额外的依赖:

      npm
      yarn
      pnpm
      npm install -D babel-jest @babel/core @babel/preset-env @babel/preset-react @babel/preset-typescript
      yarn add -D babel-jest @babel/core @babel/preset-env @babel/preset-react @babel/preset-typescript
      pnpm install -D babel-jest @babel/core @babel/preset-env @babel/preset-react @babel/preset-typescript

      #配置 Jest

      你需要进一步配置 jest.config.ts 文件,以便让 Jest 能够正确地编译和运行测试用例。下面是一个最基本的配置:

      jest.config.ts
      import type { Config } from 'jest';
      
      const config: Config = {
        coverageProvider: 'babel',
        setupFilesAfterEnv: ['<rootDir>/jest.setup.ts'],
        testEnvironment: 'jsdom',
        transform: {
          '^.+\\.(js|jsx|ts|tsx)$': 'babel-jest',
        },
        transformIgnorePatterns: [],
      };
      
      export default config;

      配置中,将 transformIgnorePatterns 设置为了空数组,意味着所有的文件都会经过编译,如果你希望提升测试运行的速度,可以按需配置。

      setupFilesAfterEnv 会在启动时执行,在 jest.setup.ts 中,可以引入 @testing-library/jest-dom。它包含了一组便捷的自定义匹配器,例如 .toBeInTheDocument(),使编写测试变得更容易:

      jest.setup.ts
      import '@testing-library/jest-dom';

      #配置 Babel

      你需要配置 Babel 让 Jest 能够自动编译 JSX 等语法,下面是一个基本的配置:

      babel.config.js
      module.exports = {
        presets: [
          ['@babel/preset-env', { targets: { node: 'current' } }],
          ['@babel/preset-react', { runtime: 'automatic' }],
          '@babel/preset-typescript',
        ],
      };

      #编写测试用例

      现在,你可以开始编写测试用了,首先在 package.json 中添加一个 test 命令:

      package.json
      {
        "scripts": {
          "test": "jest"
        }
      }

      创建一个简单的页面用于测试:

      routes/page.tsx
      import { Link } from '@modern-js/runtime/router';
      
      const Index = () => (
        <div>
          <h1>Home</h1>
          <Link to="/about">About</Link>
        </div>
      );
      
      export default Index;

      添加测试用例,检测页面中是否有预期的文本:

      __tests__/page.test.tsx
      import '@testing-library/jest-dom';
      import { render, screen } from '@testing-library/react';
      import { BrowserRouter as Router } from '@modern-js/runtime/router';
      import Page from '../routes/page';
      
      describe('Page', () => {
        it('renders a heading', () => {
          render(
            <Router>
              <Page />
            </Router>,
          );
      
          const heading = screen.getByRole('heading', { level: 1 });
      
          expect(heading).toBeInTheDocument();
        });
      });

      上述用例中,我们从 @modern-js/runtime/router 引入了 <Router> 组件,这是因为 React Router 在渲染部分路由相关组件时,必须要有对应的上下文。

      Note

      直接在 Modern.js 应用中运行时,<Router> 组件会自动注入。

      #运行测试用例

      执行上述 test 命令,运行测试用例:

       PASS  src/__tests__/page.test.tsx
        Page
          ✓ renders a heading (31 ms)
      
      Test Suites: 1 passed, 1 total
      Tests:       1 passed, 1 total
      Snapshots:   0 total
      Time:        0.959 s, estimated 1 s