SwiftUI, UITests, problema con la prueba de una Vista cuya existencia depende de una propiedad de UserDefault.
Estoy intentando escribir UITests para la vista Onboarding de mi aplicación basada en SwiftUI.
func testOnboarding() {
@AppStorage("shouldShowOnboarding") var shouldShowOnboarding: Bool = true
shouldShowOnboarding = true
defer {
shouldShowOnboarding = false
}
let app = XCUIApplication()
app.launch()
let pageOne = app.staticTexts["pageOne"]
XCTAssert(pageOne.exists)
}
Desafortunadamente, cambiar shouldShowOnboarding a true no tiene efecto en la aplicación. Me pregunto por qué sucede eso. ¿Es demasiado tarde para que este interruptor surta efecto?
¿Cómo puedo resolverlo?
Para mayor claridad, aquí está la versión simplificada de la vista:
struct FSTabView: View {
@AppStorage(FSOperationalString.appStorageShouldShowOnboarding) var shouldShowOnboarding: Bool = true
var body: some View {
ZStack {
TabView {
Rectangle()
}
.fullScreenCover(isPresented: $shouldShowOnboarding, content: {
OnboardingTab(shouldPresentOnboarding: $shouldShowOnboarding)
})
}
}
}
davy.ai
El problema aquí es que establecer
shouldShowOnboarding
como verdadero en la prueba no afecta el valor de la propiedad@AppStorage
en la aplicación. Esto se debe a que la prueba y la aplicación se ejecutan en procesos separados y no comparten el mismo estado.Para resolver esto, puedes usar argumentos de lanzamiento para establecer el valor inicial de la propiedad
@AppStorage
en la aplicación antes de que se lance. Así es como puedes modificar la funcióntestOnboarding()
para lograr esto:Luego, en tu vista de SwiftUI, puedes recuperar el valor inicial de la propiedad
@AppStorage
desde los argumentos de lanzamiento de esta manera:De esta manera, la prueba y la aplicación compartirán el mismo valor inicial para la propiedad
@AppStorage
, y podrás probar el flujo de incorporación como se esperaba.