es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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)
            })
        }
    }
}
Tags:  , ,

Answer

  1. Avatar for 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ón testOnboarding() para lograr esto:

    func testOnboarding() {
        let app = XCUIApplication()
        // Establecer los argumentos de lanzamiento para establecer el valor inicial de la propiedad @AppStorage
        app.launchArguments = ["-shouldShowOnboarding", "true"]
        app.launch()
    
        let pageOne = app.staticTexts["pageOne"]
    
        XCTAssert(pageOne.exists)
    }
    

    Luego, en tu vista de SwiftUI, puedes recuperar el valor inicial de la propiedad @AppStorage desde los argumentos de lanzamiento de esta manera:

    struct FSTabView: View {
        @AppStorage(FSOperationalString.appStorageShouldShowOnboarding) var shouldShowOnboarding: Bool = {
            // Recuperar el valor inicial de los argumentos de lanzamiento
            CommandLine.arguments.contains("-shouldShowOnboarding")
        }()
        var body: some View {
            ZStack {
                TabView {
                    Rectangle()
                }
                .fullScreenCover(isPresented: $shouldShowOnboarding, content: {
                    OnboardingTab(shouldPresentOnboarding: $shouldShowOnboarding)
                })
            }
        }
    }
    

    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.

Comments are closed.