Próbuję przetestować wygląd etykiety (toastLabel), którą mam animację, która pojawia się krótko, gdy ktoś wprowadzi niewłaściwy adres e-mail.Testowanie animowanej etykiety, która pojawia się i znika
private func registerNewUser(email: String, password: String, confirmationPassword: String) {
if password == confirmationPassword {
firebaseData.createUser(email: email, password: password, completion: { (error, _) in
if let error = error {
self.showToast(in: self.view, with: error.localizedDescription)
} else {
self.showToast(in: self.view, with: "Registered succesfully")
self.signInUser(email: email, password: password)
}
})
} else {
//raise password mismatch error
print("password mismatch error")
}
}
func showToast(in toastSuperView: UIView, with text: String) {
let toastLabel = ToastLabel()
toastLabel.text = text
toastSuperView.addSubview(toastLabel)
layoutToastLabel(toastLabel)
animateToastLabel(toastLabel)
}
private func layoutToastLabel(_ toastLabel: ToastLabel) {
toastLabel.centerYToSuperview()
toastLabel.pinToSuperview(edges: [.left, .right])
}
private func animateToastLabel(_ toastLabel: ToastLabel) {
UIView.animate(withDuration: 2.5, delay: 0, options: .curveEaseOut, animations: {
toastLabel.alpha = 0.0
}, completion: { _ in
toastLabel.removeFromSuperview()
})
}
Chcę po prostu sprawdzić, czy tekst błędu otrzymał z powrotem pojawia Firebase po wejściu użytkownika e-mail, które zostały już podjęte.
Kiedy korzystam z innych narzędzi, takich jak oczekiwanie i XCTWaiter, testy nadal nie przechodzą mimo niezaprzeczalnego tekstu i etykiety. Nigdy nie musiałem wykonywać takich testów, więc nie jestem pewien, gdzie mogę pójść źle, czy muszę zrobić coś innego, aby przetestować animowany widok lub coś takiego.
Update1:
Więc widzę po nieco bardziej, że kiedy gra dotknij registerButton tosty pojawia się tak jak powinien, ale test nie będzie kontynuowana, dopóki nie zniknął. Uważam, że to dziwne, ponieważ nie jest ściśle związane z registerButton jest własnym zdaniem.
Update2:
mam zaktualizować mój test następująco:
func testRegisteringWithUsedEmailDisplaysFirebaseError() {
welcomeScreenHelper.register(email: registeredEmail,
password: password,
confirmationPassword: password,
completion: {
let firebaseErrorMessage = "The email address is already in use by another account."
let text = self.app.staticTexts[firebaseErrorMessage]
let exists = NSPredicate(format: "exists == true")
self.expectation(for: exists, evaluatedWith: text, handler: nil)
self.waitForExpectations(timeout: 10, handler: nil)
XCTAssert(self.app.staticTexts[firebaseErrorMessage].exists)
})
}
z dodatkiem:
override func setUp() {
app.launch()
UIView.setAnimationsEnabled(false)
super.setUp()
}
override func tearDown() {
if let email = createdUserEmail {
firebaseHelper.removeUser(with: email)
}
UIView.setAnimationsEnabled(true)
super.tearDown()
}
Ale do tej pory nie ma szczęścia. Wciąż widzę, że po kliknięciu przycisku rejestru na grzbiecie pojawia się toast, a kolejna linia nie jest wywoływana, dopóki toastLabel nie zakończy animacji.
Trudno jednak dostrzec problem w kodzie - istnieją pewne sposoby, ale brakuje kontekstu. Podobnie jak: 'func testRegisteringWithUsedEmailDisplaysFirebaseError()' jest zdecydowanie w 'klasie MyTest: XCTestCase'; to 'func register (email: String, password: String, confirmationPassword: String, completion: (() -> Void)? = nil)' również metoda 'MyTest'? Wydaje się, że to metoda pośrednia. Czy w jakiś sposób wstrzykujesz 'firebaseData'? Podanie większej ilości kontekstu zdecydowanie poprawiłoby jakość pytania. –
Sprawdź poprawkę –