返回顶部
f

fosmvvm-serverrequest-test-generator服务端请求测试生成器

Generate ServerRequest tests using VaporTesting. Covers typed request/response validation for Show, Create, Update, and Delete operations.

作者: admin | 来源: ClawHub
源自
ClawHub
版本
V 2.0.6
安全检测
已通过
652
下载量
免费
免费
2
收藏
概述
安装方式
版本历史

fosmvvm-serverrequest-test-generator

FOSMVVM ServerRequest 测试生成器

使用 VaporTesting 基础设施为 ServerRequest 类型生成测试文件。

概念基础

完整架构上下文请参阅 FOSMVVMArchitecture.md | OpenClaw 参考

ServerRequest 测试使用 VaporTesting 基础设施,通过完整的服务器栈发送类型化请求:

┌─────────────────────────────────────────────────────────────────────┐
│ ServerRequest 测试流程 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 测试代码: │
│ let request = MyRequest(query: .init(...)) │
│ app.testing().test(request, locale: en) { response in } │
│ │
│ 基础设施处理: │
│ • 从类型名称推导路径(MyRequest → /my) │
│ • 从操作类型推导 HTTP 方法(ShowRequest → GET) │
│ • 查询/请求体编码 │
│ • 请求头注入(locale, version) │
│ • 响应解码为 ResponseBody 类型 │
│ │
│ 你需要验证: │
│ • response.status(HTTPStatus) │
│ • response.body(R.ResponseBody? - 类型化!) │
│ • response.error(R.ResponseError? - 类型化!) │
│ │
└─────────────────────────────────────────────────────────────────────┘



请先阅读以下内容

测试 ServerRequest 使用 VaporTesting 基础设施。永远不要手动构建 URL。

┌──────────────────────────────────────────────────────────────────────┐
│ SERVERREQUEST 测试使用 TestingApplicationTester │
├──────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 配置包含路由的 Vapor Application │
│ 2. 使用 app.testing().test(request, locale:) { response in } │
│ 3. 验证 response.status、response.body、response.error │
│ │
│ TestingServerRequestResponse 提供类型化访问: │
│ • status: HTTPStatus │
│ • headers: HTTPHeaders │
│ • body: R.ResponseBody? ← 自动解码! │
│ • error: R.ResponseError? ← 自动解码! │
│ │
└──────────────────────────────────────────────────────────────────────┘

绝对不要这样做

swift
// ❌ 错误 - 手动构建 URL
let url = URL(string: http://localhost:8080/my_request?query=value)!
let response = try await URLSession.shared.data(from: url)

// ❌ 错误 - 使用字符串路径和方法
try await app.test(.GET, /my_request) { response in }

// ❌ 错误 - 手动 JSON 编码/解码
let json = try JSONEncoder().encode(requestBody)
let decoded = try JSONDecoder().decode(ResponseBody.self, from: data)

// ❌ 错误 - 手动构建 TestingHTTPRequest
let httpRequest = TestingHTTPRequest(method: .GET, url: /path, headers: headers)
try await app.testing().performTest(request: httpRequest)

始终这样做

swift
// ✅ 正确 - 使用 TestingApplicationTester.test() 配合 ServerRequest
let request = MyShowRequest(query: .init(userId: userId))
try await app.testing().test(request, locale: en) { response in
#expect(response.status == .ok)
#expect(response.body?.viewModel.name == Expected Name)
}

// ✅ 正确 - 测试多语言环境
for locale in [en, es] {
try await app.testing().test(request, locale: locale) { response in
#expect(response.status == .ok)
// 本地化值会自动处理
}
}

// ✅ 正确 - 测试错误响应
let badRequest = MyShowRequest(query: .init(userId: invalidId))
try await app.testing().test(badRequest, locale: en) { response in
#expect(response.status == .notFound)
#expect(response.error != nil)
}

路径从 ServerRequest 类型推导。HTTP 方法来自操作类型。请求头自动处理。你永远不需要编写 URL 字符串或手动解码 JSON。



何时使用此技能

  • - 测试任何 ServerRequest 实现
  • 验证 CRUD 操作的服务器响应
  • 测试错误处理和边界情况
  • 多语言环境响应验证
  • 客户端请求类型与服务器控制器之间的集成测试

如果你正准备编写 URLSession、app.test(.GET, /path) 或手动 JSON 解码,请立即停止并使用此技能。

此技能生成的内容

文件位置用途
{Feature}RequestTests.swiftTests/{Target}Tests/Requests/ServerRequest 测试套件
测试 YAML(如需)
Tests/{Target}Tests/TestYAML/ | 测试 ViewModel 的本地化 |

项目结构配置

占位符描述示例
{Feature}功能或实体名称(帕斯卡命名法)Idea、User、Dashboard
{Target}
服务器测试目标 | WebServerTests、AppTests | | {ViewModelsTarget} | 共享 ViewModels SPM 目标 | ViewModels | | {WebServerTarget} | 服务端目标 | WebServer、AppServer | | {ResourceDir} | YAML 资源目录 | TestYAML、Resources |

关键类型

TestingServerRequestResponse

封装 HTTP 响应并提供类型化访问:

属性类型描述
statusHTTPStatusHTTP 状态码(.ok、.notFound 等)
headers
HTTPHeaders | 响应头 |
| body | R.ResponseBody? | 类型化响应体(自动解码) |
| error | R.ResponseError? | 类型化错误(自动解码) |

TestingApplicationTester 扩展

swift
func test(
_ request: R,
locale: Locale = en,
headers: HTTPHeaders = [:],
afterResponse: (TestingServerRequestResponse) async throws -> Void
) async throws -> any TestingApplicationTester

便捷语言环境

TestingApplicationTester 上可用:

  • - en - 英语
  • enUS - 英语(美国)
  • enGB - 英语(英国)
  • es - 西班牙语



测试结构

基本测试套件

swift
import FOSFoundation
@testable import FOSMVVM
import FOSTesting
import FOSTestingVapor
import Foundation
import Testing
import Vapor
import VaporTesting

@Suite(MyFeature 请求测试)
struct MyFeatureRequestTests {
@Test func showRequest_成功() async throws {
try await withTestApp { app in
let request = MyShowRequest(query: .init(id: validId))

try await app.testing().test(request, locale: en) { response in
#expect(response.status == .ok)
#expect(response.body?.viewModel != nil)
}
}
}

@Test func showRequest_未找到() async throws {
try await withTestApp { app in
let request = MyShowRequest(query: .init(id: invalidId))

try await app.testing().test(request, locale: en) { response in
#expect(response.status == .notFound)
}
}
}
}

private func withTestApp(_ test: (Application) async throws -> Void) async throws {
try await withApp { app in
// 配置路由
try app.routes.register(collection: MyController())
try await test(app)
}
}

测试不同请求类型

请求类型HTTP 方法测试内容
ShowRequestGET查询参数、响应体、本地化
ViewModelRequest
GET | ViewModel 填充、所有本地化字段 | | CreateRequest | POST | RequestBody 验证、创建的实体、ID 响应 | | UpdateRequest | PATCH | RequestBody 验证、更新的实体、响应 | | DeleteRequest | DELETE | 实体删除、状态码 |

如何使用此技能

调用方式:
/fosmvvm-serverrequest-test-generator

前置条件:

  • - 从对话上下文中理解 ServerRequest 类型
  • 已确定测试场景(成功

标签

skill ai

通过对话安装

该技能支持在以下平台通过对话安装:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 fosmvvm-serverrequest-test-generator-1776420040 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 fosmvvm-serverrequest-test-generator-1776420040 技能

通过命令行安装

skillhub install fosmvvm-serverrequest-test-generator-1776420040

下载

⬇ 下载 fosmvvm-serverrequest-test-generator v2.0.6(免费)

文件大小: 10.07 KB | 发布时间: 2026-4-17 18:38

v2.0.6 最新 2026-4-17 18:38
Initial ClawHub release

Archiver·手机版·闲社网·闲社论坛·羊毛社区· 多链控股集团有限公司 · 苏ICP备2025199260号-1

Powered by Discuz! X5.0   © 2024-2025 闲社网·线报更新论坛·羊毛分享社区·http://xianshe.com

p2p_official_large
返回顶部