Я унаследовал кодовую базу 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()
}