# WebApp 与 APICatalog 单元测试报告
# 1. 测试范围
覆盖 Air.Cloud.WebApp 的动态 API、统一返回、友好异常、数据验证,以及 Air.Cloud.Plugins.APICatalog 的 APIProbe Provider 与中间件行为。
# 2. 本次重点变更
本轮重点验证 DynamicApi 与 APICatalog 的标准元数据链路:
- DynamicApi 内部职责拆分后,动词、命名、HTTP 方法、参数绑定、路由、统一返回元数据仍保持原行为。
- DynamicApi 组件通过 DI 注册并由 convention 组合,避免把 resolver/builder 固化在 convention 内部。
ApiDescriptionSettingsAttribute会生成APIProbeEndpointMetadata并写入 MVCEndpointMetadata。Penetrates.ControllerOrderCollection不再由 DynamicApi convention 写入,避免全局状态污染。- APICatalog 默认
ApiExplorerAPIProbeProvider读取APIProbeEndpointMetadata,并按Group -> Order -> Path -> Method排序。
# 3. 测试内容与边界
| 类别 | 覆盖点 | 关键边界 | 预期结果 |
|---|---|---|---|
| 动态 API 动词映射 | 默认动词、自定义动词、双词动词 | getlist、自定义 verb、多 convention 实例 | 正确推断 HTTP 方法;不污染全局动词表。 |
| 动态 API 命名 | 控制器 / Action affix 裁剪、KeepVerb | Async 后缀、动词保留、小写路由 | ActionName 与路由生成稳定。 |
| 参数绑定 | Body、Query、Route 参数 | ModelToQuery、QueryParametersAttribute、数组、URL 参数化 | 绑定源符合设计规则。 |
| 路由生成 | 参数 seat、约束、大小写 | ControllerStart、ControllerEnd、ActionEnd、:guid | 路由模板稳定生成。 |
| 统一返回元数据 | bool、void、已包装模型 | RESTfulResult<bool>、void | bool 可生成返回模型;void 不生成成功包装元数据。 |
| APIProbe 元数据 | 控制器级、方法级、空配置 | 方法级覆盖控制器级;无配置不写入 | 只在需要时写入 APIProbeEndpointMetadata。 |
| APICatalog 读取 | 标准元数据读取、Fallback、分组过滤、排序 | 缺少标准元数据、负数 Order、默认 Order | 输出分组、标签、描述和排序符合标准。 |
| 注册顺序 | WebApp / UnifyResult 组合 | 反向注册、只注册 Core、只注册 UnifyResult | MVC convention 和过滤器顺序稳定。 |
| 友好异常 | Oops、IfException、异常包装 | 业务异常、全局处理器、统一返回 | 异常结果可被统一返回 Provider 包装。 |
# 4. 本轮新增测试
本轮在已有 WebApp / APICatalog 测试基础上继续补充:
DynamicApiConvention_should_prefer_action_api_probe_metadata_over_controller_metadataDynamicApiConvention_should_not_write_api_probe_metadata_when_description_settings_absentApiExplorer_provider_should_filter_by_standard_metadata_group_nameApiExplorer_provider_should_fallback_when_standard_metadata_is_missingApiExplorer_provider_should_keep_zero_order_as_default
加上上一轮已补充的 DI 注册、无全局排序状态、APICatalog 标准元数据消费等用例,DynamicApi/APICatalog 元数据链路已有正向、覆盖、空配置、Fallback、排序和过滤边界。
# 5. 测试结果
本报告已单独运行 WebApp、APICatalog、FriendlyException 相关过滤命令,结果:105/105 通过。
dotnet test test/Air.Cloud.UnitTest/Air.Cloud.UnitTest.csproj --no-restore --filter "FullyQualifiedName~WebApp|FullyQualifiedName~APICatalog|FullyQualifiedName~FriendlyException"
# 6. 构建结果
相关类库构建结果均为 0 警告、0 错误:
dotnet build src/core/Air.Cloud.Core/Air.Cloud.Core.csproj --no-restore
dotnet build src/core/Air.Cloud.WebApp/Air.Cloud.WebApp.csproj --no-restore
dotnet build src/plugins/Air.Cloud.Plugins.APICatalog/Air.Cloud.Plugins.APICatalog.csproj --no-restore
# 7. 结论
DynamicApi 与 APICatalog 的元数据链路已经从全局状态迁移到 MVC EndpointMetadata 标准承载方式。
当前测试覆盖可以防止以下回归:
- 动态 API convention 重新写入
ControllerOrderCollection。 - resolver/builder 重新退回 convention 内部硬编码。
- APICatalog 忽略
APIProbeEndpointMetadata.Order。 - 方法级
ApiDescriptionSettingsAttribute覆盖规则失效。 - 缺少标准元数据时 APICatalog Fallback 失效。