Come al solito, stavo giocando con il mio progetto parallelo per imparare alcune tecniche, questa volta era Espresso. Tuttavia sono caduto in una trappola che mi ha impedito di superare una prova.
@Test
fun testEmptyNameInput() {
launchFragmentInHiltContainer<FirstTodoListFragment> {
navController.setGraph(R.navigation.nav_main)
navController.setCurrentDestination(R.id.firstTodoListFragment)
Navigation.setViewNavController(requireView(), navController)
}
onView(withId(R.id.next_btn)).perform(click())
runTest {
repository.queryTodoList().test {
val res = awaitItem()
res.size shouldBeEqualTo 1
res.first().name shouldBeEqualTo context.getString(R.string.default_list_name)
cancelAndIgnoreRemainingEvents()
}
}
navController.currentDestination?.id shouldBeEqualTo R.id.listFragment
}
Ho controllato sia la logica del test che la logica del modello di visualizzazione, nulla dovrebbe essere sbagliato. Quindi ho deciso di mettere un punto di interruzione sul mio ascoltatore di clic sul pulsante. Ho eseguito di nuovo il test in modalità debug, solo per notare che il punto di interruzione non si è attivato.
Perché è stato? Ho passato ore a controllare di nuovo la mia logica, ho provato molte combinazioni possibili, ho trovato il colpevole.
private fun FragmentFirstTodoListBinding.setupInput() {
listNameInputLayout.root.hint = getString(R.string.list_name)
TextInputUtil.showKeyboard(requireActivity(), listNameInputLayout.input) // the culprit
listNameInputLayout.input.doOnTextChanged { text, _, _, _ ->
viewModel.setInputName(text.toString())
}
}
Ma perché un metodo di utilità che fa apparire la tastiera virtuale causa il fallimento del test? La mia ipotesi personale è che spingerà il pulsante verso l'alto, facendo perdere a Espresso il clic su di esso.
Sposta il pulsante in alto
Certo, il test ora passa, ma cosa succede se non voglio spostare il pulsante?
Aggiungi pressBack()prima del clic del pulsante nel test
@Test
fun testEmptyNameInput() {
launchFragmentInHiltContainer<FirstTodoListFragment> {
navController.setGraph(R.navigation.nav_main)
navController.setCurrentDestination(R.id.firstTodoListFragment)
Navigation.setViewNavController(requireView(), navController)
}
pressBack() //added to the test
onView(withId(R.id.next_btn)).perform(click())
runTest {
repository.queryTodoList().test {
val res = awaitItem()
res.size shouldBeEqualTo 1
res.first().name shouldBeEqualTo context.getString(R.string.default_list_name)
cancelAndIgnoreRemainingEvents()
}
}
navController.currentDestination?.id shouldBeEqualTo R.id.listFragment
}
Il progetto giocattolo in questo articolo:https://github.com/BNSC1/Todo
Turo è il mercato di car sharing più grande al mondo in cui gli ospiti possono prenotare qualsiasi auto desiderino e ovunque desiderino, da una vivace comunità di host fidati. Gli sviluppatori di Turo hanno recentemente investito molto per migliorare le prestazioni di avvio della sua applicazione Android.
Immergiamoci nel mondo delle architetture di sviluppo Android. In questa guida completa, esploriamo diversi modelli architetturali, framework e best practice per aiutarti a creare applicazioni Android robuste, scalabili e gestibili.
Per evitare ambiguità verranno utilizzati i seguenti termini; Autenticatore; Il telefono cellulare utilizzato per effettuare il login Sito web; Il sito Web o l'applicazione che l'utente sta utilizzando per effettuare la richiesta di accesso al Servizio; Il fornitore che fornisce il servizio dato, ad es
Nel mondo interconnesso di oggi, la minaccia degli attacchi informatici è più diffusa che mai. I criminali informatici e gli attori dello stato-nazione cercano costantemente di sfruttare le vulnerabilità e rubare dati preziosi, ponendo un rischio significativo per le organizzazioni di tutte le dimensioni.
[Avviso di attivazione: questo saggio include schermate di persone che elogiano l'assassino di Jordan Neely.] I funzionari delle forze dell'ordine hanno finalmente - e forse con riluttanza - accusato Daniel Penny, l'uomo che ha soffocato Jordan Neely fino alla sua morte, per quell'omicidio.
La scorsa settimana ho notato un comunicato stampa, inviato tramite PressGazette (un sito Web di notizie sui media britannici). L'articolo annunciava che Acast, la società di hosting e pubblicità di podcast di Scandi, avrebbe guidato un consorzio di editori "probabilmente i più influenti" nel podcasting.