-
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 - Introduction
- 2:01 - Meet CometCal: your first test
- 2:29 - How AppIntentsTesting works
- 9:39 - Testing entity queries
- 13:49 - Combining multiple intents
- 16:27 - Test-only intents
- 18:22 - Testing Spotlight indexing
- 20:56 - Testing view annotations
- 24:00 - The App Intents testing workflow
- 25:19 - Next steps
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") }
-
-
- 0:16 - Introduction
AppIntentsTesting, a new framework for testing App Intents, which power Siri, Shortcuts, Spotlight, and Widgets. Outlines the agenda: getting started, framework overview, testing intents and entities, and system integrations.
- 2:01 - Meet CometCal: your first test
Introduces the CometCal sample calendar app and writes a first test for CreateCalendarIntent: create a UI testing bundle, build an IntentDefinitions from the bundle id, call makeIntent with parameters, run() it on-device, and assert on the returned entity via dynamic member lookup.
- 2:29 - How AppIntentsTesting works
An integration testing framework that runs your tests in a standard XCUITest bundle while the app runs in a separate process, executing intents through the full App Intents stack, with no mocks and no app-code imports (just a bundle id), giving stable, CI-friendly tests.
- 9:39 - Testing entity queries
Test-driven development of an EntityStringQuery: call entities(matching:) on the entity definition, watch it fail, implement the entities(matching:) conformance on EventEntityQuery, and rerun to green, verified against Shortcuts on device.
- 13:49 - Combining multiple intents
Chain intents in one test as people compose Shortcuts: run CreateEventIntent (with the runtime resolving a CalendarEntity from a string), then pass the returned EventEntity straight into UpdateEventIntent and assert the updated title.
- 16:27 - Test-only intents
Focused intents that exist only for tests, to seed known state, jump directly to a view, or wrap not-yet-adopted functionality. Make any intent test-only with isDiscoverable: false and an #if DEBUG guard.
- 18:22 - Testing Spotlight indexing
Write a regression test for Spotlight: spotlightQuery() returns nothing before the event exists, create it with CreateEventIntent, then assert exactly one indexed result, catching the real bug where indexing was commented out.
- 20:56 - Testing view annotations
Verify the entity Siri sees on screen: open an event via OpenEventIntent, use XCUI to confirm the page, call viewAnnotations(), and assert the single ViewAnnotation's entity, surfacing a bug where the wrong EntityIdentifier (calendar id) was used.
- 24:00 - The App Intents testing workflow
Where AppIntentsTesting fits: unit-test the fundamental types (actions, data, queries) first, then integration-test deeper system reaches (view annotations, Spotlight, cross-app), and still test manually with Siri and Shortcuts.
- 25:19 - Next steps
Download the CometCal sample project and its full test suite, consult the AppIntentsTesting documentation for the complete API, and explore the talk on building Siri experiences with App Intents.