Semplice problema. Ho un pulsante che esegue il passaggio al controller della vista successiva. Voglio scrivere sull'interfaccia utente XCTest per dirmi che ha aperto il controller di visualizzazione che volevo.UITesting, XCTest current ViewController Class
risposta
Il framework di test dell'interfaccia utente non ha accesso al codice delle applicazioni che rende impossibili le asserzioni di classe sulle istanze. Non sei in grado di direttamente indicare la classe del controller che si trova sullo schermo.
Tuttavia, se si pensa al test in modo leggermente diverso è possibile fare un'affermazione molto simile. Scrivi i tuoi test come se tu fossi l'utente. Al tuo utente non importa se lui/lei sta guardando uno ItemDetailViewController
o uno ItemListTableViewController
quindi né i test dovrebbero.
L'utente importa cosa c'è sullo schermo. Qual'è il titolo? Oppure, quali sono i nomi di questi pulsanti? Seguendo questa logica si riscrive il test per affermare in base a tali elementi, non il nome della classe codificata.
Ad esempio, se si presenta il controller in una pila di navigazione è possibile affermare il titolo.
let app = XCUIApplication()
app.buttons["View Item"].tap()
XCTAssert(app.navigationBars["Some Item"].exists)
Oppure, se lo schermo è presentato in modo modale ma si conoscono alcuni testi o pulsanti statici, utilizzare quelli.
let app = XCUIApplication()
app.buttons["View Item"].tap()
XCTAssert(app.staticTexts["Item Detail"].exists)
XCTAssert(app.buttons["Remove Item"].exists)
Grazie, questo aiuta molto. Ho fatto esattamente la cosa, ma pensavo che mi mancasse qualcosa. –
Nel mio caso, devo 'sleep (1)' prima di 'app.buttons [" View Item "]. Tap()' per farlo funzionare – onmyway133
Sento che ci deve essere un modo migliore per farlo ... Cosa succede se quando cambi testo nell'app? Cosa succede se hai più localizzazioni del testo nell'app? Sembra che richiederebbe un bel po 'di test se fosse localizzato e un potenziale mal di testa di manutenzione se il testo dovesse cambiare. –