Просмотр исходного кода

📝 docs(story): 更新前端文件路径和添加Taro测试文档

- 修改前端页面和组件路径,从src/client迁移到mini/src目录
- 添加Taro测试文档,包含安装、配置和使用方法
- 更新测试文件路径,从tests/unit/client/home调整为tests/unit/mini
- 补充Change Log记录路径变更信息
yourname 4 месяцев назад
Родитель
Сommit
0a9be18500
2 измененных файлов с 147 добавлено и 10 удалено
  1. 11 10
      docs/stories/005.001.story.md
  2. 136 0
      docs/taro-test.md

+ 11 - 10
docs/stories/005.001.story.md

@@ -50,13 +50,13 @@ Draft
   - [ ] 配置搜索字段:name, description
   - [ ] 配置筛选字段:type (去程活动/返程活动)
 - [ ] 实现前端页面迁移 (从mini-demo迁移) (AC: 1, 2, 3, 4)
-  - [ ] 迁移首页 - 基于 `mini-demo/pages/home/home` 在 `src/client/home/pages/` 创建 `HomePage.tsx`
-  - [ ] 迁移活动选择页面 - 基于 `mini-demo/pages/select-activity/select-activity` 在 `src/client/home/pages/` 创建 `ActivitySelectPage.tsx`
-  - [ ] 迁移班次列表页面 - 基于 `mini-demo/pages/schedule-list/schedule-list` 在 `src/client/home/pages/` 创建 `ScheduleListPage.tsx`
+  - [ ] 迁移首页 - 基于 `mini-demo/pages/home/home` 在 `mini/src/pages/home/` 创建 `HomePage.tsx`
+  - [ ] 迁移活动选择页面 - 基于 `mini-demo/pages/select-activity/select-activity` 在 `mini/src/pages/select-activity/` 创建 `ActivitySelectPage.tsx`
+  - [ ] 迁移班次列表页面 - 基于 `mini-demo/pages/schedule-list/schedule-list` 在 `mini/src/pages/schedule-list/` 创建 `ScheduleListPage.tsx`
   - [ ] 集成查询表单和结果展示
   - [ ] 使用React Query调用通用CRUD API
 - [ ] 实现前端活动筛选组件 (AC: 2)
-  - [ ] 在 `src/client/home/components/` 创建 `ActivityFilter.tsx` 组件
+  - [ ] 在 `mini/src/components/` 创建 `ActivityFilter.tsx` 组件
   - [ ] 支持活动类型筛选
 - [ ] 编写单元测试、集成测试和E2E测试 (AC: 1, 2, 3, 4)
   - [ ] 为所有新实体编写单元测试 (`tests/unit/server/`)
@@ -92,10 +92,10 @@ Draft
 - **后端实体**: `src/server/modules/routes/route.entity.ts`, `src/server/modules/activities/activity.entity.ts` [Source: architecture/source-tree.md#实际项目结构]
 - **API路由**: `src/server/api/routes/index.ts`, `src/server/api/activities/index.ts` [Source: architecture/source-tree.md#实际项目结构]
 - **前端页面**:
-  - `src/client/home/pages/HomePage.tsx` (首页)
-  - `src/client/home/pages/ActivitySelectPage.tsx` (活动选择页面)
-  - `src/client/home/pages/ScheduleListPage.tsx` (班次列表页面) [Source: architecture/source-tree.md#实际项目结构]
-- **前端组件**: `src/client/home/components/ActivityFilter.tsx` [Source: architecture/source-tree.md#实际项目结构]
+  - `mini/src/pages/home/HomePage.tsx` (首页)
+  - `mini/src/pages/select-activity/ActivitySelectPage.tsx` (活动选择页面)
+  - `mini/src/pages/schedule-list/ScheduleListPage.tsx` (班次列表页面) [Source: architecture/source-tree.md#实际项目结构]
+- **前端组件**: `mini/src/components/ActivityFilter.tsx` [Source: architecture/source-tree.md#实际项目结构]
 - **共享类型**: `src/share/route.types.ts`, `src/share/activity.types.ts` [Source: architecture/source-tree.md#实际项目结构]
 
 ### 技术栈要求
@@ -167,11 +167,11 @@ Draft
   - 边界条件:无活动数据、活动状态筛选
   - 关联查询:活动关联的路线数据
   - 错误场景:无效类型参数、认证失败
-- 前端组件的单元测试 (`tests/unit/client/home/`)
+- 前端组件的单元测试 (`tests/unit/mini/`)
   - 组件渲染:首页、活动选择、班次列表页面
   - 用户交互:查询表单提交、筛选条件变更
   - 状态管理:查询结果展示、加载状态处理
-- 查询功能的集成测试 (`tests/integration/client/home/`)
+- 查询功能的集成测试 (`tests/integration/mini/`)
   - 完整查询流程:首页查询 → 活动筛选 → 班次列表
   - 数据一致性:前端展示与后端数据一致
   - 错误处理:网络错误、API错误处理
@@ -182,6 +182,7 @@ Draft
 ## Change Log
 | Date | Version | Description | Author |
 |------|---------|-------------|--------|
+| 2025-10-15 | 1.6 | 修正前端页面路径从src/client到mini/src目录 | Bob (Scrum Master) |
 | 2025-10-15 | 1.5 | 修复测试位置与测试策略文档不一致问题,添加安全要求和数据库迁移任务 | Bob (Scrum Master) |
 | 2025-10-15 | 1.4 | 补充MVP文档中标识为暂时不要的页面元素 | Bob (Scrum Master) |
 | 2025-10-15 | 1.3 | 明确迁移来源为mini-demo并添加页面结构分析 | Bob (Scrum Master) |

+ 136 - 0
docs/taro-test.md

@@ -0,0 +1,136 @@
+版本:4.x
+概述
+对 Taro 进行组件/应用级别的单元测试
+
+该测试工具更加关注组件的用户行为和外部表现,而不是内部实现细节
+
+Github 地址:传送门
+
+安装
+在 Taro 项目根目录下安装
+
+# React:
+npm i @tarojs/test-utils-react --save
+# Vue3:
+npm i @tarojs/test-utils-vue3 --save
+# Vue2:
+npm i @tarojs/test-utils-vue --save
+
+注意
+@tarojs/plugin-platform-h5为前置 peerDependencies,请勿删除该依赖申明
+
+使用
+安装 Jest
+npm i jest --save
+
+配置 Jest
+在 Taro 项目根目录添加文件jest.config.js。配置文件如下:
+
+// react
+const defineJestConfig = require('@tarojs/test-utils-react/dist/jest.js').default
+// vue3
+// const defineJestConfig = require("@tarojs/test-utils-vue3/dist/jest.js").default;
+// vue2
+// const defineJestConfig = require("@tarojs/test-utils-vue/dist/jest.js").default;
+
+module.exports = defineJestConfig({
+  // testEnvironment: 'jsdom',  // 测试使用的环境
+  // testMatch: ['<rootDir>/__test__/**/*.test.{js,ts}'],  // 测试文件匹配
+})
+
+defineJestConfig 已内置了部分初始化配置,需要修改可自行配置覆盖 配置文件参考 Jest 官网:Configuring Jest
+
+编写测试用例
+组件级别
+// __test__/main/index.test.js
+import TestUtils from '@tarojs/test-utils-react'
+import Hello from '../../src/components/Hello.tsx'
+const testUtils = new TestUtils()
+describe('App', () => {
+  it('RenderComponent', async () => {
+    // React跟Vue相同用法
+    await testUtils.mount(Hello, {
+      props: {
+        // 配置项
+        a: 1,
+      },
+    })
+    // 等待页面出现.btn这个节点
+    const btn = await testUtils.queries.waitForQuerySelector('.btn')
+    // 等待react的渲染更新完成
+    await testUtils.act(() => {
+      // 触发点击事件
+      testUtils.fireEvent.click(btn)
+    })
+    // 打印渲染结果
+    expect(testUtils.html()).toMatchSnapshot()
+    // <div class="hello">...
+  })
+})
+
+运行测试
+# package.json
+# scripts: {
+#   "test": "jest",
+# }
+npm run test
+
+应用级别
+// __test__/main/index.test.js
+import TestUtils from '@tarojs/test-utils-react'
+import Taro from '@tarojs/taro'
+import App from '../../src/app.ts'
+const testUtils = new TestUtils()
+describe('App', () => {
+  it('RenderApp', async () => {
+    await testUtils.createApp()
+    // 监听/pages/index/index这个页面路由的onShow生命周期触发
+    await testUtils.PageLifecycle.onShow('/pages/index/index')
+    // 跳转到第二个页面
+    Taro.navigateTo({ url: '/pages/second/index' })
+    // 监听/pages/second/index这个页面路由的onShow生命周期触发
+    await testUtils.PageLifecycle.onShow('/pages/second/index')
+    // 当/pages/second/index触发onShow后,打印页面内容
+    expect(testUtils.html()).toMatchSnapshot()
+    // <body><div class="taro_router" id="app">...
+  })
+})
+
+多端
+对于小程序的测试,我们提供了环境变量对 Jest 环境进行区分:TARO_ENV_JEST,我们可以在调用 jest 测试时设置对应的环境变量
+
+// package.json
+scripts: {
+  "test": "jest",
+   "test:weapp": "export TARO_ENV_JEST=weapp && jest"
+}
+
+这里会有几点差异:
+
+环境差异
+这里会将运行代码中的process.env.TARO_ENV切换为TARO_ENV_JEST的值,主要用于一些"环境判断"比如下面的代码将会在test:weapp执行:
+
+if (process.env.TARO_ENV === 'weapp') {
+  // ....setState(....)
+  console.log('this is weapp')
+}
+
+标签差异
+除此之外html()输出的节点内容也会改变,将以小程序标签的形式输出,例如:
+
+<!-- h5 -->
+<taro-core-view className="cls">
+  <taro-image-view src="xxx">
+    <img src="xxx" />
+  </taro-image-view>
+</taro-core-view>
+
+<!-- weapp -->
+<view className="cls">
+  <image src="xxx" />
+</view>
+
+因为这是一个在线运行的测试工具,主要目的也是对用户行为和外部表现进行测试断言,在测试环境使用的还是以 h5 的形式来模拟整个程序的运行,对于其他小程序特有的生命周期和 API,我们推荐以下做法:
+
+生命周期: 使用PageLifecycle的triggerXxxxx进行生命周期的触发
+API: 使用jest提供的mock方法来模拟@tarojs/taro的 api,模拟小程序的返回值