Тестирование кнопки Dynami c - PullRequest
0 голосов
/ 10 апреля 2020

Я унаследовал кодовую базу SwiftUI и пытаюсь написать для нее несколько UITests.

Теперь я все еще догоняю скорость написания кода Swift и SwiftUI, поэтому я не уверен в законности используемого шаблона проектирования. По сути, существует начальное представление, которое начинается с начального @State и начинает передавать его оттуда в более позднее представление через тег @Binding.

Из-за тестирования пользовательского интерфейса Swift, требующего метки Accessibility, кнопка ниже вызывает у меня небольшую головную боль. Для нескольких представлений существует только один BottomTextButton, содержимое которого в нем динамически изменяется в зависимости от оператора case и просматриваемого нами представления.

    struct TextButton {
        enum ButtonType {
            case signUp
            case logIn
        }
    }

    //View for the bottom text button in the signup / login flow.
    struct BottomTextButton: View {

        @Binding var loginSignupScreen: LoginSignupFlow.ScreenType
        @Binding var bottomTextButton: TextButton.ButtonType
        @Binding var signUpCTA: String
        @Binding var transitonBackward: Bool
        @Binding var buttonAccessibilityLabel: String

        var body: some View {

            Button(action: {

                    switch self.bottomTextButton {
                    case .logIn:
                        self.transitonBackward = false
                        self.loginSignupScreen = .logIn
                        self.bottomTextButton = .signUp
                        self.signUpCTA = "Text me a code"
                        self.buttonAccessibilityLabel = "logIn"

                    case .signUp:
                        self.transitonBackward = true
                        self.loginSignupScreen = .signUp
                        self.bottomTextButton = .logIn
                        self.buttonAccessibilityLabel = "signUp"
                    }

            }) {
                VStack(spacing: 0) {
                    bottomTextButtonFunction()
                }
                .padding([.bottom], 20)
                .frame(width: UIScreen.main.bounds.width)
            }
            .accessibility(label: Text("\(self.buttonAccessibilityLabel)"))

        }

        func bottomTextButtonFunction() -> AnyView {
           switch bottomTextButton {
                case .signUp: return AnyView(SignUpButtonView())
                case .logIn: return AnyView(LogInButtonView())
            }
        }
    }

    //Sign Up Button
    struct SignUpButtonView: View {
        var body: some View {
            VStack(spacing: 0) {
                Text("Don't have an account?")
                    .scaledFont(name: "Gotham Light", size: 16)
                    .foregroundColor(Color("baydynamic"))
                Text("Sign Up")
                    .scaledFont(name: "Gotham Medium", size: 16)
                    .foregroundColor(Color("baydynamic"))
            }
        }
    }

    //Log In Button
    struct LogInButtonView: View {
        var body: some View {
            VStack(spacing: 0) {
                Text("Already have an account?")
                    .scaledFont(name: "Gotham Light", size: 16)
                    .foregroundColor(Color("baydynamic"))
                Text("Log In")
                    .scaledFont(name: "Gotham Medium", size: 16)
                    .foregroundColor(Color("baydynamic"))
            }
        }
    }
}
}

Вот пример того, как BottomTextButton реализуется:

HStack(alignment: .top) {
    VStack {
        if self.loginSignupScreen == .logIn {
            LoginView(
                loginSignupScreen: $loginSignupScreen,
                bottomTextButton: $bottomTextButton,
                loggedIn: $loggedIn,
                transitonBackward: $transitonBackward
            )} else if self.loginSignupScreen == .signUp {
                SignUpView(
                    loginSignupScreen: $loginSignupScreen, 
                    bottomTextButton: $bottomTextButton, 
                    signUpCTA: $signUpCTA, 
                    transitonBackward: $transitonBackward
                )}
            }
        }

VStack {
    BottomTextButton(
        loginSignupScreen: $loginSignupScreen,
        bottomTextButton: $bottomTextButton,
        signUpCTA: $signUpCTA,
        transitonBackward: $transitonBackward,
        buttonAccessibilityLabel: $buttonAccessibilityLabel
    )
}

Сейчас я пытаюсь динамически изменить метку доступности, но затем я сталкиваюсь с ошибкой:

Failed to synthesize event: Failed to scroll to visible (by AX action) Button, label: 'signUp', error: Error kAXErrorCannotComplete performing AXAction 2003 on element AX element pid: 4327, elementOrHash.elementID: 105553148256224.19

Здесь пример того, как я пытаюсь проверить это:

func testSignUpViewForm() {
    let loginBottomButton = app.buttons["logIn"]
    XCTAssertTrue(loginBottomButton.exists)
    loginBottomButton.tap()

    let signUpBottomButton = app.buttons["signUp"]
    XCTAssertTrue(signUpBottomButton.exists)
    signUpBottomButton.tap()

}
...