Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Generate ViewModel tests with codable round-trip, versioning stability, and multi-locale translation verification.
Generate ViewModel tests with codable round-trip, versioning stability, and multi-locale translation verification.
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
Generate test files for ViewModels following FOSMVVM testing patterns.
For full architecture context, see FOSMVVMArchitecture.md | OpenClaw reference ViewModel testing in FOSMVVM verifies three critical aspects: Codable round-trip - ViewModel encodes and decodes without data loss Versioning stability - Structure hasn't changed unexpectedly Multi-locale translations - All @LocalizedString properties have values in all supported locales The LocalizableTestCase protocol provides infrastructure that tests all three in a single call.
Creating tests for new ViewModels Adding test coverage to existing ViewModels Verifying localization completeness across locales Testing ViewModels with embedded/nested child ViewModels Verifying @LocalizedSubs substitution behavior
FileLocationPurpose{Name}ViewModelTests.swiftTests/{Target}Tests/Localization/Test suite conforming to LocalizableTestCase{Name}ViewModel.ymlTests/{Target}Tests/TestYAML/YAML translations for test (if needed)
For most ViewModels, a single line provides complete coverage: @Test func dashboardViewModel() throws { try expectFullViewModelTests(DashboardViewModel.self) } This verifies: Codable encoding/decoding Versioned ViewModel stability Translations exist for all locales (en, es by default) This is sufficient for the vast majority of ViewModel tests.
When testing specific formatting behavior (substitutions, compound strings), add locale-specific assertions: @Test func greetingWithSubstitution() throws { try expectFullViewModelTests(GreetingViewModel.self) // Verify specific substitution behavior let vm: GreetingViewModel = try .stub() .toJSON(encoder: encoder(locale: en)) .fromJSON() #expect(try vm.welcomeMessage.localizedString == "Welcome, John!") } This is optional - use only when verifying specific formatting techniques.
Test suites conform to LocalizableTestCase to access testing infrastructure: import FOSFoundation @testable import FOSMVVM import FOSTesting import Foundation import Testing @testable import {ViewModelsTarget} @Suite("My ViewModel Tests") struct MyViewModelTests: LocalizableTestCase { let locStore: LocalizationStore init() throws { self.locStore = try Self.loadLocalizationStore( bundle: {ViewModelsTarget}.resourceAccess, resourceDirectoryName: "" ) } } The {ViewModelsTarget}.resourceAccess is the resource accessor defined when creating the ViewModels SPM target (via FOSResourceAccessor build tool plugin).
Property/MethodPurposelocStoreRequired - the localization storelocalesOptional - locales to test (default: en, es)encoder(locale:)Creates a localizing JSONEncoderen, es, enGB, enUSLocale constants
MethodUse WhenexpectFullViewModelTests(_:)Primary - complete ViewModel testingexpectTranslations(_:)Translation-only verificationexpectFullFieldValidationModelTests(_:)Testing FieldValidationModel typesexpectFullFormFieldTests(_:)Testing FormField instancesexpectCodable(_:encoder:)Codable round-trip onlyexpectVersionedViewModel(_:encoder:)Versioning stability only
Every ViewModel with @LocalizedString properties needs YAML entries: @ViewModel public struct DashboardViewModel: RequestableViewModel { @LocalizedString public var pageTitle // Needs YAML entry @LocalizedString public var emptyMessage // Needs YAML entry public let itemCount: Int // No YAML needed } # DashboardViewModel.yml en: DashboardViewModel: pageTitle: "Dashboard" emptyMessage: "No items yet" es: DashboardViewModel: pageTitle: "Tablero" emptyMessage: "No hay elementos todavΓa"
When a ViewModel contains child ViewModels, all types in the hierarchy need YAML entries: @ViewModel public struct BoardViewModel: RequestableViewModel { @LocalizedString public var title public let cards: [CardViewModel] // Child ViewModel } @ViewModel public struct CardViewModel { @LocalizedString public var cardTitle } Both BoardViewModel and CardViewModel need YAML entries (can be in same or separate files).
When tests define private ViewModel structs for testing specific scenarios, those also need YAML: // In test file private struct TestParentViewModel: ViewModel { @LocalizedString var title let children: [TestChildViewModel] } private struct TestChildViewModel: ViewModel { @LocalizedString var label } Add entries to a test YAML file for these private types.
Invocation: /fosmvvm-viewmodel-test-generator Prerequisites: ViewModel structure understood from conversation context Localization properties identified (@LocalizedString, @LocalizedSubs, etc.) YAML localization files exist or will be created Child ViewModels identified (if any) Workflow integration: This skill is used when adding test coverage for ViewModels. The skill references conversation context automaticallyβno file paths or Q&A needed. Typically follows fosmvvm-viewmodel-generator.
This skill references conversation context to determine test structure:
From conversation context, the skill identifies: ViewModels to test (from prior discussion or codebase) Localization requirements (@LocalizedString properties) Child ViewModels (embedded within parent) Substitution behavior (@LocalizedSubs needing specific verification)
Verifies completeness: ViewModel YAML entries (all @LocalizedString properties) Child ViewModel entries (nested types) Locale coverage (en, es, or project-specific locales)
Creates test suite with: LocalizableTestCase conformance Localization store initialization expectFullViewModelTests() calls for each ViewModel Optional specific formatting tests (substitutions, compound strings)
Skill references information from: Prior conversation: ViewModels discussed or recently created ViewModel code: If Claude has read ViewModel files into context YAML files: From codebase analysis of existing localizations Test patterns: From existing test files in project
See reference.md for complete file templates.
@Test func dashboardViewModel() throws { try expectFullViewModelTests(DashboardViewModel.self) }
@Test func boardViewModels() throws { try expectFullViewModelTests(BoardViewModel.self) try expectFullViewModelTests(ColumnViewModel.self) try expectFullViewModelTests(CardViewModel.self) }
var locales: Set<Locale> { [en, es, enGB] } // Override default @Test func multiLocaleViewModel() throws { try expectFullViewModelTests(MyViewModel.self) // Tests en, es, AND en-GB }
@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!") }
@Test func parentWithChildren() throws { // Tests parent AND verifies children can be encoded/decoded try expectFullViewModelTests(ParentViewModel.self) // Optionally verify specific child values let vm: ParentViewModel = try .stub() .toJSON(encoder: encoder(locale: en)) .fromJSON() #expect(try vm.children[0].label.localizedString == "Child 1") }
FOSLocalizableError: _pageTitle -- Missing Translation -- en Cause: YAML entry missing for a @LocalizedString property. Fix: Add the property to the YAML file: en: MyViewModel: pageTitle: "Page Title" # Add this
Cause: The ViewModel wasn't encoded with a localizing encoder. Fix: Ensure using encoder(locale:) or expectFullViewModelTests().
Cause: YAML values exist but may have typos or wrong content. Fix: Add specific assertions to verify exact values: let vm = try .stub().toJSON(encoder: encoder(locale: en)).fromJSON() #expect(try vm.title.localizedString == "Expected Value")
ConceptConventionExampleTest suite{Feature}ViewModelTestsDashboardViewModelTestsTest file{Feature}ViewModelTests.swiftDashboardViewModelTests.swiftYAML file{ViewModelName}.ymlDashboardViewModel.ymlTest method{viewModelName}() or descriptivedashboardViewModel()
FOSMVVMArchitecture.md - Testing Support - Architecture overview fosmvvm-viewmodel-generator - For creating ViewModels fosmvvm-fields-generator - For form validation testing reference.md - Complete file templates
VersionDateChanges1.02025-01-02Initial skill1.12026-01-19Updated LocalizableTestCase example to use {ViewModelsTarget}.resourceAccess pattern.1.22026-01-24Update to context-aware approach (remove file-parsing/Q&A). Skill references conversation context instead of asking questions or accepting file paths.
Code helpers, APIs, CLIs, browser automation, testing, and developer operations.
Largest current source with strong distribution and engagement signals.