studio con activities android android-fragments android-testing android-espresso

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 cada Activity por su cuenta. En la mayoría de los casos, los Fragments no ofrecen ninguna ventaja sobre las Activities . Fragments solo dificultan la implementación y las pruebas.
  • Habilite su FragmentActivity para mostrar directamente un Fragment determinado cuando se crea. Por ejemplo, suministrando un intento especial adicional a tu FragmentActivity . 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) }