Skip to content

Commit 2b65118

Browse files
committed
优化tests11-16的readme描述
1 parent 888b51e commit 2b65118

File tree

6 files changed

+150
-14
lines changed

6 files changed

+150
-14
lines changed

tests/test11/README.md

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,28 @@
1-
## 测试场景-当前组件访问当前组件的服务
1+
## 测试场景-Vue Router 与依赖注入集成
22

3-
主要测试了 declareRootProviders 配置全局vue router 和 vue route
3+
### 测试目的
4+
5+
验证将 Vue Router 的实例(router 和 route)注册为全局服务,并通过依赖注入在组件和服务中使用。
6+
7+
### 测试要点
8+
9+
1. **通过 Token 注册路由相关实例**
10+
- 使用 `declareRootProviders` 将 router 和 route 实例注册到全局容器
11+
- 使用 `Token<T>` 创建类型安全的标识符,用于访问 router 和 route
12+
- 应用 `toConstantValue` 将现有的路由实例绑定到容器
13+
- 使用 `markRaw` 标记路由对象以避免 Vue 的响应式处理
14+
15+
2. **服务中注入路由实例**
16+
- 在 DemoService 类中使用 `@Inject(TYPES.route)``@Inject(TYPES.router)` 注入路由实例
17+
- 服务可直接访问路由信息和路由导航方法
18+
19+
3. **多种方式访问路由对象的一致性**
20+
- 比较 Vue 的原生方法(`useRoute`/`useRouter`)与依赖注入的方法获取的实例一致性
21+
- 验证组件中直接使用的路由实例与服务中注入的路由实例的相等性
22+
- 确保通过 `getRootService` 获取的路由实例与组件和服务中的实例相同
23+
24+
4. **路由导航与状态的实时同步**
25+
- 点击路由链接后,所有使用不同方式获取的路由信息都同步更新
26+
- 路由变化反映在组件和服务的不同方法中
27+
28+
这个测试说明了框架如何与 Vue Router 集成,并展示了使用依赖注入系统管理路由实例的灵活方式。这种方法可以有效简化路由对象的访问和测试。

tests/test12/README.md

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,21 @@
1-
## 测试场景-当前组件访问当前组件的服务
1+
## 测试场景-useService 的使用约束
22

3-
主要测试了 useService在组件外调用的异常
3+
### 测试目的
4+
5+
验证 `useService` 函数的使用约束,特别是测试其只能在 Vue 组件的 setup 函数内部调用的限制。
6+
7+
### 测试要点
8+
9+
1. **正确使用场景**
10+
- 在组件的 `<script setup>` 内部调用 `useService(DemoService)` 正常工作
11+
- 成功获取 DemoService 的实例并可访问其方法和属性
12+
13+
2. **使用限制测试**
14+
- 在组件的 setup 函数外部直接调用 `useService(DemoService)` 会引发异常
15+
- 抛出错误消息:"getProvideContainer 只能在 setup 中使用"
16+
17+
3. **设计原理验证**
18+
- `useService` 依赖于 Vue 的组件上下文和依赖注入机制
19+
- 当没有有效的组件上下文时无法获取服务实例
20+
21+
这个测试对于理解框架的使用边界十分重要,它明确指出 `useService` 函数只能在组件的 setup 函数中调用,而不能在组件外部直接使用。如果需要在组件外部获取服务实例,应使用 `getRootService` 函数来访问全局注册的服务。

tests/test13/README.md

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,25 @@
1-
## 测试场景-当前组件访问当前组件的服务
1+
## 测试场景-服务注册缺失时的错误处理
22

3-
主要测试了 useService在组件内调用,但是没有declareProvides绑定服务,导致找不到服务异常
3+
### 测试目的
4+
5+
验证当组件使用 `useService` 尝试获取未注册的服务时的错误处理机制。这个测试关注的是框架对缺失依赖项的适当报错能力。
6+
7+
### 测试要点
8+
9+
1. **未注册服务的错误检测**
10+
- 组件中调用 `useService(DemoService)` 但未先通过 `declareProviders` 注册服务
11+
- 测试系统是否能正确检测到该错误情况
12+
13+
2. **错误信息明确性**
14+
- 报错信息应清晰指出问题:"No matching binding found for token: DemoService"
15+
- 错误信息中包含未找到对应绑定的服务名称,便于开发者识别问题
16+
17+
3. **异常发生时机**
18+
- 错误发生在组件挂载时(mount),而非代码编译阶段
19+
- 框架在运行时发现服务注册问题并立即抛出错误
20+
21+
4. **正确的使用模式提示**
22+
- 错误消息间接提示需要为所需服务先建立绑定关系
23+
- 这个测试的存在强调了使用框架的正确顺序:先 `declareProviders`,后 `useService`
24+
25+
这个测试用例对于理解服务容器的错误处理机制非常重要,帮助开发者快速发现和解决依赖注入相关的注册问题,避免在生产环境中出现未知服务引用导致的运行时错误。

tests/test14/README.md

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,26 @@
1-
## 测试场景-当前组件访问当前组件的服务
1+
## 测试场景-组件级与全局级服务注册的区别
22

3-
主要测试了 getRootService在组件外调用,但是没有declareRootProvides绑定服务,导致找不到服务异常
3+
### 测试目的
4+
5+
验证组件级服务注册与全局级服务注册的严格区分,以及当试图使用 `getRootService` 访问未在全局容器中注册的服务时的错误处理机制。
6+
7+
### 测试要点
8+
9+
1. **组件级注册不等同于全局级注册**
10+
- 在组件中通过 `declareProviders([DemoService])` 注册的服务仅限于组件范围内访问
11+
- 组件内使用 `useService(DemoService)` 可以正常获取服务实例
12+
- 组件外使用 `getRootService(DemoService)` 尝试获取全局服务实例则会失败
13+
14+
2. **容器隔离机制验证**
15+
- 组件级容器和全局级容器是相互隔离的
16+
- 只有通过 `declareRootProviders` 注册的服务才能被 `getRootService` 获取
17+
18+
3. **明确的错误信息**
19+
- 当尝试使用 `getRootService` 获取未注册的全局服务时,框架抛出错误:"No matching binding found for token: DemoService"
20+
- 错误信息清晰指出了问题所在及缺失的服务标识
21+
22+
4. **正确使用方式的引导**
23+
- 测试用例展示了在需要全局访问服务时必须使用 `declareRootProviders`
24+
- 明确区分了不同注册方式对应的不同服务访问方法
25+
26+
这个测试用例对理解服务注册的不同层级和范围非常重要。它强调了 `declareProviders``declareRootProviders` 的区别,以及如何正确地选择相应的服务获取方式(`useService``getRootService`)。这有助于开发者设计具有适当作用域的服务架构。

tests/test15/README.md

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,29 @@
1-
## 测试场景-当前组件访问当前组件的服务
1+
## 测试场景-@PostConstruct 装饰器与 API 错误处理
22

3-
主要测试了 多次调用 PostConstruct
3+
### 测试目的
44

5-
还测试了@PostConstruct 方法抛出异常
5+
验证 `@PostConstruct` 装饰器的使用规则、错误处理以及框架关键 API 的使用限制。
66

7-
还测试了 declareProviders 在组件外调用的异常
7+
### 测试要点
8+
9+
1. **@PostConstruct 的单次使用验证**
10+
- 单个类中仅使用一次 `@PostConstruct` 装饰器是合法的
11+
- 创建含有单个 `@PostConstruct` 方法的类实例不会抛出异常
12+
- 装饰的方法在实例创建时将自动执行
13+
14+
2. **@PostConstruct 的多次使用限制**
15+
- 在同一个类中多次使用 `@PostConstruct` 装饰器是禁止的
16+
- 尝试创建含有多个 `@PostConstruct` 方法的类实例将抛出错误
17+
- 错误信息清晰提示:"Cannot apply @PostConstruct decorator multiple times in the same class"
18+
19+
3. **@PostConstruct 方法异常处理**
20+
- 如果 `@PostConstruct` 设计的初始化方法抛出异常,则异常会被向上传递
21+
- 使用含有异常的 `@PostConstruct` 方法的服务在组件挂载时将导致错误
22+
- 错误信息保留了原始异常消息,如"something wrong"
23+
24+
4. **declareProviders 的使用限制**
25+
- `declareProviders` 函数只能在组件的 setup 函数内部调用
26+
- 在组件外部直接调用 `declareProviders` 会抛出异常
27+
- 错误信息指明了限制:"getProvideContainer 只能在 setup 中使用"
28+
29+
这个测试用例验证了框架的多种限制和错误处理机制,帮助开发者避免常见错误,并按照框架预期的方式使用 API。`@PostConstruct` 装饰器的限制确保了服务初始化逻辑的清晰性,而 API 使用限制则确保了服务容器的正确使用。

tests/test16/README.md

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,29 @@
1-
## 测试场景
1+
## 测试场景-应用上下文中的 useService 行为
22

3-
useService 在 app.runWithContext 中执行
3+
### 测试目的
4+
5+
验证在 Vue 应用的 `app.runWithContext` 上下文中使用 `useService` 获取服务的行为、作用域以及与全局服务和组件级服务的关系。
6+
7+
### 测试要点
8+
9+
1. **应用级别上下文的 useService 行为**
10+
-`app.runWithContext` 回调中可以成功调用 `useService`
11+
- 这提供了一种在组件外部获取服务的方式
12+
- 与组件中直接调用不同,这里需要应用上下文环境
13+
14+
2. **应用上下文中 useService 获取全局服务**
15+
- 当服务已通过 `declareRootProviders` 注册为全局服务时
16+
-`app.runWithContext` 中调用 `useService` 将返回全局单例
17+
- 这个实例与通过 `getRootService` 获得的实例是相同的
18+
19+
3. **应用上下文服务与组件级服务的隔离性**
20+
- 组件内部通过 `declareProviders``useService` 获取的服务实例
21+
- 与应用上下文中或全局获取的服务实例不是同一个
22+
- 组件级服务保持了独立的实例和状态
23+
24+
4. **不同层级的服务实例隔离**
25+
- 测试明确验证了组件内服务(`wrapper.vm.service`)与应用级服务(`appDemoService`)不同
26+
- 同时组件内服务与全局服务(`rootDemoService`)也不同
27+
- 而应用级服务和全局服务是相同的实例
28+
29+
这个测试用例说明了在 Vue 应用初始化阶段使用 `app.runWithContext` 访问服务的模式,以及不同环境下服务实例的隔离和依赖关系。这对于理解服务实例的作用域和共享性非常重要。

0 commit comments

Comments
 (0)