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.Activitiesson más fáciles de probar. Puede probar cadaActivitypor su cuenta. En la mayoría de los casos, losFragmentsno ofrecen ninguna ventaja sobre lasActivities.Fragmentssolo dificultan la implementación y las pruebas. - Habilite su
FragmentActivitypara mostrar directamente unFragmentdeterminado 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)
}