con - Espresso de Android: ¿Cómo pruebo un fragmento específico al seguir una actividad a varias arquitecturas de fragmentos
navigation drawer con activities (3)
Mi aplicación consiste en una Activity
para muchos Fragments
.
Deseo usar Espresso para probar la interfaz de usuario de los Fragments
. Sin embargo me encontré con un problema.
¿Cómo puedo probar un Fragment
que no se agrega a una Activity
en onCreate
? Todos los ejemplos que he visto con Fragments
implican que el Fragment
se agrega en onCreate
. Entonces, ¿cómo puedo decirle a Espresso que vaya a un Fragment
específico y comience desde ahí?
Gracias
El espresso puede probar los Fragments
solo si se muestran. Y eso requiere que sean mostrados por una Activity
.
Con su configuración actual, tendrá que usar Espresso para click()
su manera (como lo haría un usuario) en el Fragment
que realmente desea probar.
En uno de mis proyectos tengo un ViewPager
que muestra Fragments
. Para esos Fragments
, uso una FragmentTestRule
personalizada para probarlos de forma aislada. Puedo comenzar cada Fragment
directamente y usar Espresso para probarlo. Ver esta respuesta
También podrías:
- No utilice
Fragments
.Activities
son más fáciles de probar. Puede probar cadaActivity
por su cuenta. En la mayoría de los casos, losFragments
no ofrecen ninguna ventaja sobre lasActivities
.Fragments
solo dificultan la implementación y las pruebas. - Habilite su
FragmentActivity
para mostrar directamente unFragment
determinado cuando se crea. Por ejemplo, suministrando un intento especial adicional a tuFragmentActivity
. Pero esto agregaría un código de prueba a su aplicación, que generalmente no es una buena solución.
Si está utilizando el componente de Arquitectura de Navegación, puede probar cada fragmento al instante mediante un enlace profundo al fragmento de destino (con los argumentos apropiados) al comienzo de la prueba.
@Rule
@JvmField
var activityRule = ActivityTestRule(MainActivity::class.java)
protected fun launchFragment(destinationId: Int,
argBundle: Bundle? = null) {
val launchFragmentIntent = buildLaunchFragmentIntent(destinationId, argBundle)
activityRule.launchActivity(launchFragmentIntent)
}
private fun buildLaunchFragmentIntent(destinationId: Int, argBundle: Bundle?): Intent =
NavDeepLinkBuilder(InstrumentationRegistry.getInstrumentation().targetContext)
.setGraph(R.navigation.navigation)
.setComponentName(MainActivity::class.java)
.setDestination(destinationId)
.setArguments(argBundle)
.createTaskStackBuilder().intents[0]
destinationId es el ID de destino del fragmento en el gráfico de navegación. Este es un ejemplo de una llamada que se haría una vez que esté listo para lanzar el fragmento:
launchFragment(R.id.target_fragment, targetBundle())
private fun targetBundle(): Bundle? {
val bundle = Bundle()
bundle.putString(ARGUMENT_ID, "Argument needed by fragment")
return bundle
}
También responda con más detalle aquí: https://.com/a/55203154/2125351
Solo muestre el Fragmento usando el Gestor de Archivos de Soporte de la Actividad.
Por ejemplo (Kotlin) con ActivityTestRule:
@Rule
@JvmField
var activityRule = ActivityTestRule(MainActivity::class.java)
Solo haz esto antes de tus pruebas:
@Before
fun setup() {
activityRule.activity.supportFragmentManager.beginTransaction().replace(R.id.main_activity_container_for_your_fragments, FragmentToShow(), "fragment-tag").commitAllowingStateLoss()
Thread.sleep(500)
}