File tree Expand file tree Collapse file tree 6 files changed +150
-14
lines changed Expand file tree Collapse file tree 6 files changed +150
-14
lines changed Original file line number Diff line number Diff line change 1
- ## 测试场景-当前组件访问当前组件的服务
1
+ ## 测试场景-Vue Router 与依赖注入集成
2
2
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 集成,并展示了使用依赖注入系统管理路由实例的灵活方式。这种方法可以有效简化路由对象的访问和测试。
Original file line number Diff line number Diff line change 1
- ## 测试场景-当前组件访问当前组件的服务
1
+ ## 测试场景-useService 的使用约束
2
2
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 ` 函数来访问全局注册的服务。
Original file line number Diff line number Diff line change 1
- ## 测试场景-当前组件访问当前组件的服务
1
+ ## 测试场景-服务注册缺失时的错误处理
2
2
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
+ 这个测试用例对于理解服务容器的错误处理机制非常重要,帮助开发者快速发现和解决依赖注入相关的注册问题,避免在生产环境中出现未知服务引用导致的运行时错误。
Original file line number Diff line number Diff line change 1
- ## 测试场景-当前组件访问当前组件的服务
1
+ ## 测试场景-组件级与全局级服务注册的区别
2
2
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 ` )。这有助于开发者设计具有适当作用域的服务架构。
Original file line number Diff line number Diff line change 1
- ## 测试场景-当前组件访问当前组件的服务
1
+ ## 测试场景-@ PostConstruct 装饰器与 API 错误处理
2
2
3
- 主要测试了 多次调用 PostConstruct
3
+ ### 测试目的
4
4
5
- 还测试了 @PostConstruct 方法抛出异常
5
+ 验证 ` @PostConstruct ` 装饰器的使用规则、错误处理以及框架关键 API 的使用限制。
6
6
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 使用限制则确保了服务容器的正确使用。
Original file line number Diff line number Diff line change 1
- ## 测试场景
1
+ ## 测试场景-应用上下文中的 useService 行为
2
2
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 ` 访问服务的模式,以及不同环境下服务实例的隔离和依赖关系。这对于理解服务实例的作用域和共享性非常重要。
You can’t perform that action at this time.
0 commit comments