-
Comprueba la implementación de App Intents con AppIntentsTesting
Te presentamos AppIntentsTesting, un nuevo framework para validar tus App Intents a través de la misma infraestructura que utilizan Siri, Atajos y Spotlight. Descubre cómo ejecutar intenciones, revisar resultados y probar entidades y consultas, todo ello sin necesidad de automatizar la interfaz de usuario. Descubre cómo verificar integraciones como las anotaciones de vistas y la indexación de Spotlight, lo que te ayudará a detectar errores en una fase temprana de tu flujo de trabajo de desarrollo.
Capítulos
- 0:16 - Introducción
- 2:01 - Presentamos CometCal: tu primera prueba
- 2:29 - Cómo funciona AppIntentsTesting
- 9:39 - Pruebas de consulta de entidades
- 13:49 - Combinación de varias intenciones
- 16:27 - Intenciones solo para pruebas
- 18:22 - Pruebas de indexación de Spotlight
- 20:56 - Pruebas de anotaciones de vista
- 24:00 - El flujo de trabajo de pruebas de App Intents
- 25:19 - Próximos pasos
Recursos
-
Buscar este video…
-
-
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") }
-