-
Validez l’adoption de vos App Intents avec AppIntentsTesting
Découvrez AppIntentsTesting : un nouveau framework pour valider vos App Intents via la même infrastructure que celle utilisée par Siri, Raccourcis et Spotlight. Apprenez comment exécuter des intents, inspecter les résultats et tester des entités et des requêtes, sans devoir automatiser l'interface utilisateur. Maîtrisez comment vérifier des intégrations telles que View annotations et l'indexation Spotlight, afin de repérer les bogues à un stade précoce de votre processus de développement.
Chapitres
- 0:16 - Introduction
- 2:01 - Découvrez CometCal : votre premier test
- 2:29 - Fonctionnement d’AppIntentsTesting
- 9:39 - Tester les requêtes d’entités
- 13:49 - Combiner plusieurs Intents
- 16:27 - Intents dédiés aux tests
- 18:22 - Tester l’indexation de Spotlight
- 20:56 - Tester les annotations de vue
- 24:00 - Workflow de test App Intents
- 25:19 - Étapes suivantes
Ressources
-
Rechercher dans cette vidéo…
-
-
6:48 - Your first test: execute an intent
import AppIntentsTesting func testCreateCalendar() async throws { let definitions = IntentDefinitions(bundleIdentifier: "com.example.apple-samplecode.CometCal") let createCalendar = definitions.intents["CreateCalendarIntent"] let result = try await createCalendar.makeIntent( name: "Occupy Saturn", color: "red" ).run() XCTAssertEqual(try result.value.title, "Occupy Saturn") } -
12:25 - Test an entity string query
// Testing Entity string queries func testEventStringQuery() async throws { let results = try await eventEntityDefinition .entities(matching: "Cosmic Ray") XCTAssertEqual(results.count, 1) XCTAssertEqual(try results[0].title, "Cosmic Ray Calibration") } -
13:00 - Implement the EntityStringQuery under test
// Updated query implementation struct EventEntityQuery: EntityStringQuery { func entities(for identifiers: [EventEntity.ID]) async throws -> [EventEntity] { } func suggestedEntities() async throws -> [EventEntity] { } func entities(matching string: String) async throws -> [EventEntity] { try calendarManager.fetchEvents() .filter { $0.title.localizedCaseInsensitiveContains(string) } .map(\.entity) } } -
15:42 - Chain multiple intents in one test
// Test event creation followed by update func testCreateAndUpdateEvent() async throws { let createResult = try await createEventDefinition.makeIntent( title: "Asteroid Dodgeball Practice", startDate: Date(), isAllDay: false, calendar: "Deep Space" ).run() XCTAssertEqual(try createResult.value.title, "Asteroid Dodgeball Practice") let updateResult = try await updateEventDefinition.makeIntent( title: "Asteroid Dodgeball Rules Overview", event: createResult.value ).run() XCTAssertEqual(try updateResult.value.title, "Asteroid Dodgeball Rules Overview") } -
17:45 - Make an intent test-only
// Test-only intent: SeedSampleEventsIntent #if DEBUG struct SeedSampleEventsIntent: AppIntent { static let isDiscoverable = false func perform() async throws -> some IntentResult { // Create known list of events return .result() } } #endif -
20:27 - Test Spotlight indexing
// Testing Spotlight indexing func testNewEventIndexedInSpotlight() async throws { let before = try await eventEntityDefinition.spotlightQuery("Supernova Viewing Party") XCTAssertTrue(before.isEmpty, "Event should not exist in Spotlight yet") // ... Create "Supernova Viewing Party" Event let after = try await eventEntityDefinition.spotlightQuery("Supernova Viewing Party") XCTAssertEqual(after.count, 1) XCTAssertEqual(try after[0].title, "Supernova Viewing Party") } -
22:33 - Test view annotations
/ Testing view annotations func testEventViewAnnotation() async throws { try await openEventDefinition.makeIntent(target: "Morning Launch Briefing").run() // Confirm correct event page let app = XCUIApplication() let title = app.staticTexts["Morning Launch Briefing"] XCTAssertTrue(title.waitForExistence(timeout: 5)) let annotations = try await eventEntityDefinition.viewAnnotations() XCTAssertEqual(annotations.count, 1, "Expected exactly one view annotation") XCTAssertEqual(try annotations[0].entity.title, "Morning Launch Briefing") }
-