技能标识:fosmvvm-serverrequest-test-generator
Generate ServerRequest tests using VaporTesting. Covers typed request/response validation for Show, Create, Update, and Delete operations.
使用 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。
如果你正准备编写 URLSession、app.test(.GET, /path) 或手动 JSON 解码,请立即停止并使用此技能。
| 文件 | 位置 | 用途 |
|---|---|---|
| {Feature}RequestTests.swift | Tests/{Target}Tests/Requests/ | ServerRequest 测试套件 |
| 测试 YAML(如需) |
| 占位符 | 描述 | 示例 |
|---|---|---|
| {Feature} | 功能或实体名称(帕斯卡命名法) | Idea、User、Dashboard |
| {Target} |
封装 HTTP 响应并提供类型化访问:
| 属性 | 类型 | 描述 |
|---|---|---|
| status | HTTPStatus | HTTP 状态码(.ok、.notFound 等) |
| headers |
swift
func test
_ request: R,
locale: Locale = en,
headers: HTTPHeaders = [:],
afterResponse: (TestingServerRequestResponse
) async throws -> any TestingApplicationTester
TestingApplicationTester 上可用:
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 方法 | 测试内容 |
|---|---|---|
| ShowRequest | GET | 查询参数、响应体、本地化 |
| ViewModelRequest |
调用方式:
/fosmvvm-serverrequest-test-generator
前置条件:
以下为平台配置的接入选项,并非逐项实测通过。能否安装取决于客户端支持、技能来源和运行环境:
帮我安装 SkillHub 和 fosmvvm-serverrequest-test-generator-1776420040 技能
设置 SkillHub 为我的优先技能安装源,然后帮我安装 fosmvvm-serverrequest-test-generator-1776420040 技能
skillhub install fosmvvm-serverrequest-test-generator-1776420040
文件大小: 10.07 KB | 发布时间: 2026-4-17 18:38