返回顶部
f

fosmvvm-viewmodel-test-generatorViewModel测试生成器

Generate ViewModel tests with codable round-trip, versioning stability, and multi-locale translation verification.

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

fosmvvm-viewmodel-test-generator

FOSMVVM ViewModel 测试生成器

按照 FOSMVVM 测试模式为 ViewModel 生成测试文件。

概念基础

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

FOSMVVM 中的 ViewModel 测试验证三个关键方面:

  1. 1. Codable 往返 - ViewModel 编码和解码无数据丢失
  2. 版本稳定性 - 结构未发生意外变化
  3. 多语言翻译 - 所有 @LocalizedString 属性在所有支持的语言环境中都有值

LocalizableTestCase 协议提供了一次调用测试所有三者的基础设施。



何时使用此技能

  • - 为新的 ViewModel 创建测试
  • 为现有的 ViewModel 添加测试覆盖
  • 验证跨语言环境的本地化完整性
  • 测试包含嵌入/嵌套子 ViewModel 的 ViewModel
  • 验证 @LocalizedSubs 替换行为

此技能生成的内容

文件位置用途
{Name}ViewModelTests.swiftTests/{Target}Tests/Localization/符合 LocalizableTestCase 的测试套件
{Name}ViewModel.yml
Tests/{Target}Tests/TestYAML/ | 测试用的 YAML 翻译(如果需要) |

测试模式

标准模式(大多数测试)

对于大多数 ViewModel,一行代码即可提供完整覆盖:

swift
@Test func dashboardViewModel() throws {
try expectFullViewModelTests(DashboardViewModel.self)
}

此操作验证:

  • - Codable 编码/解码
  • 版本化的 ViewModel 稳定性
  • 所有语言环境(默认 en, es)的翻译存在

这对于绝大多数 ViewModel 测试来说已经足够。

扩展模式(特定格式化验证)

当测试特定的格式化行为(替换、复合字符串)时,添加特定于语言环境的断言:

swift
@Test func greetingWithSubstitution() throws {
try expectFullViewModelTests(GreetingViewModel.self)

// 验证特定的替换行为
let vm: GreetingViewModel = try .stub()
.toJSON(encoder: encoder(locale: en))
.fromJSON()

#expect(try vm.welcomeMessage.localizedString == Welcome, John!)
}

这是可选的 - 仅在验证特定格式化技术时使用。



LocalizableTestCase 协议

测试套件符合 LocalizableTestCase 以访问测试基础设施:

swift
import FOSFoundation
@testable import FOSMVVM
import FOSTesting
import Foundation
import Testing
@testable import {ViewModelsTarget}

@Suite(我的 ViewModel 测试)
struct MyViewModelTests: LocalizableTestCase {
let locStore: LocalizationStore

init() throws {
self.locStore = try Self.loadLocalizationStore(
bundle: {ViewModelsTarget}.resourceAccess,
resourceDirectoryName:
)
}
}

{ViewModelsTarget}.resourceAccess 是在创建 ViewModels SPM 目标时(通过 FOSResourceAccessor 构建工具插件)定义的资源访问器。

LocalizableTestCase 提供的内容

属性/方法用途
locStore必需 - 本地化存储
locales
可选 - 要测试的语言环境(默认:en, es) | | encoder(locale:) | 创建一个本地化 JSONEncoder | | en, es, enGB, enUS | 语言环境常量 |

测试方法

方法使用时机
expectFullViewModelTests(:)主要 - 完整的 ViewModel 测试
expectTranslations(:)
仅翻译验证 | | expectFullFieldValidationModelTests(_:) | 测试 FieldValidationModel 类型 | | expectFullFormFieldTests(_:) | 测试 FormField 实例 | | expectCodable(_:encoder:) | 仅 Codable 往返 | | expectVersionedViewModel(_:encoder:) | 仅版本稳定性 |

YAML 要求

包含 @LocalizedString 的 ViewModel

每个具有 @LocalizedString 属性的 ViewModel 都需要 YAML 条目:

swift
@ViewModel
public struct DashboardViewModel: RequestableViewModel {
@LocalizedString public var pageTitle // 需要 YAML 条目
@LocalizedString public var emptyMessage // 需要 YAML 条目
public let itemCount: Int // 不需要 YAML
}

yaml

DashboardViewModel.yml


en:
DashboardViewModel:
pageTitle: Dashboard
emptyMessage: No items yet

es:
DashboardViewModel:
pageTitle: Tablero
emptyMessage: No hay elementos todavía

嵌入的 ViewModel

当 ViewModel 包含子 ViewModel 时,层次结构中的所有类型都需要 YAML 条目:

swift
@ViewModel
public struct BoardViewModel: RequestableViewModel {
@LocalizedString public var title
public let cards: [CardViewModel] // 子 ViewModel
}

@ViewModel
public struct CardViewModel {
@LocalizedString public var cardTitle
}

BoardViewModel 和 CardViewModel 都需要 YAML 条目(可以在同一个或不同的文件中)。

私有测试 ViewModel

当测试为测试特定场景定义私有 ViewModel 结构体时,这些也需要 YAML:

swift
// 在测试文件中
private struct TestParentViewModel: ViewModel {
@LocalizedString var title
let children: [TestChildViewModel]
}

private struct TestChildViewModel: ViewModel {
@LocalizedString var label
}

为这些私有类型在测试 YAML 文件中添加条目。



如何使用此技能

调用:
/fosmvvm-viewmodel-test-generator

前提条件:

  • - 从对话上下文中理解 ViewModel 结构
  • 已识别本地化属性(@LocalizedString, @LocalizedSubs 等)
  • YAML 本地化文件已存在或将被创建
  • 已识别子 ViewModel(如果有)

工作流集成:
此技能在添加 ViewModel 测试覆盖时使用。该技能自动引用对话上下文——无需文件路径或问答。通常跟在 fosmvvm-viewmodel-generator 之后。

模式实现

此技能引用对话上下文来确定测试结构:

ViewModel 分析

从对话上下文中,该技能识别:

  • - 要测试的 ViewModel(来自之前的讨论或代码库)
  • 本地化要求(@LocalizedString 属性)
  • 子 ViewModel(嵌入在父级中)
  • 替换行为(需要特定验证的 @LocalizedSubs)

YAML 覆盖检查

验证完整性:

  • - ViewModel YAML 条目(所有 @LocalizedString 属性)
  • 子 ViewModel 条目(嵌套类型)
  • 语言环境覆盖(en, es 或项目特定的语言环境)

测试文件生成

创建包含以下内容的测试套件:

  • - LocalizableTestCase 符合性
  • 本地化存储初始化
  • 每个 ViewModel 的 expectFullViewModelTests() 调用
  • 可选的特定格式化测试(替换、复合字符串)

上下文来源

技能引用以下信息:

  • - 之前的对话:讨论过或最近创建的 ViewModel
  • ViewModel 代码:如果 Claude 已将 ViewModel 文件读入上下文
  • YAML 文件:来自对现有本地化的代码库分析
  • 测试模式:来自项目中现有的测试文件



文件模板

请参阅 reference.md 获取完整的文件模板。



常见场景

测试单个顶层 ViewModel

swift
@Test func dashboardViewModel() throws {
try expectFullViewModelTests(DashboardViewModel.self)
}

测试多个相关的 ViewModel

swift
@Test func boardViewModels() throws {
try expectFullViewModelTests(BoardViewModel.self)
try expectFullViewModelTests(ColumnViewModel.self)
try expectFullViewModelTests(CardViewModel.self)
}

使用自定义语言环境进行测试

swift
var locales: Set { [en, es, enGB] } // 覆盖默认值

@Test func multiLocaleViewModel() throws {
try expectFullViewModelTests(MyViewModel.self)
// 测试 en, es 和 en-GB
}

测试替换行为

swift
@Test func greetingSubstitutions() throws {
try expectFullViewModelTests(GreetingViewModel.self)

let vm: GreetingViewModel = try .stub(userName: Alice)
.toJSON(encoder: encoder(locale: en))
.fromJSON()

#expect(try vm.welcomeMessage.localizedString == Welcome, Alice!)
}

测试嵌入的 View

标签

skill ai

通过对话安装

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

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

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

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

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

通过命令行安装

skillhub install fosmvvm-viewmodel-test-generator-1776420040

下载

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

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

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

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

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

p2p_official_large
返回顶部