tutorial life example container ios objective-c unit-testing uiviewcontroller

ios - life - Prueba de la unidad Ciclo de vida de ViewController



navigation view controller swift 3 (2)

Acabas de sentir una gran estafa de iOS ViewControllers: apestan por la capacidad de prueba .

Otro gran problema con MVC es que desalienta a los desarrolladores de escribir pruebas unitarias. Como los controladores de vista mezclan la lógica de manipulación de vistas con la lógica de negocios, separar esos componentes por el solo hecho de realizar pruebas unitarias se convierte en una tarea hercúlea. Una tarea que muchos ignoran en favor de ... simplemente no probar nada.

fuente

¡No pruebes UIKit! Deberías probar tu propia lógica. Poner la lógica en su VC lo hace muy difícil de probar. Intenta ponerlo en otro lugar y prueba la unidad por separado. La respuesta es: debe evitar las pruebas llamando a los métodos UIKit, ¡especialmente si estos métodos no fueron diseñados para ser llamados directamente!

Si obtienes toda tu lógica del ViewController, realmente se convertirá en una vista: una clase tonta que muestra algo en la pantalla. No debería haber nada para probar allí.

Tal vez deberías pensar en usar MVVM / MVP / VIPER en su lugar. Por favor, lea el enlace provisto, lo explicará todo.

Estoy escribiendo una prueba unitaria para mis ViewControllers. ¿Cuál es la mejor práctica para métodos como viewDidAppear :, viewWillAppear:, etc.

Estoy usando [vc view] que llama a viewDidLoad. Pero aparte de viewDidLoad, ¿cómo debo probar otros métodos del ciclo de vida? ¿Es común que los prueben en una unidad? ¿Tiene sentido llamarlos directamente? me gusta:

[vc viewWillAppear:NO]; [vc viewDidAppear:NO];

Gracias


Hay muchos desarrolladores que evitan o no creen que puedas probar UIViewControllers. El doco de las pruebas pobres de manzanas tampoco ayuda con esto.

UIViewControllers es bastante comprobable con una serie de enfoques que puede tomar.

En primer lugar, como cualquiera le dirá, trate de mantener la lógica comercial fuera de su controlador de visualización. Intenta hacerlo solo para cargar la vista y tan poco como sea posible. Cambiar de la arquitectura MVC a otra cosa puede ayudar con esto. Dependiendo de lo que esté construyendo, también puede considerar usar clases personalizadas de UIView para ayudar.

Pruebas unitarias / lógicas puras

Estoy tratando con lo que Apple llama ''Prueba lógica'', es decir, un objetivo de prueba sin ningún ejecutable asignado. Todavía puedes probar mucho. Los métodos que contienen un código de manejo de vista simple se pueden probar configurando manualmente una vista, o usando el código de prueba para cargar manualmente un archivo xib, etc. Los marcos de burla como OCMock también pueden ser muy útiles.

A menudo, sin embargo, en este tipo de pruebas, terminará necesitando manualmente varios métodos de ciclo de vida para ejecutar el código que desea probar. Por ejemplo, si quiere probar un método viewDidLoad :

id mockView = OCMClassMock([UIView class]); // Setup mock expectations. myViewController.view = mockView; [myViewController viewDidLoad];

Pruebas de aplicación

Si está utilizando un objetivo de prueba donde configuró la aplicación, entonces puede realizar algunas pruebas con una prueba de unidad sin intentar navegar la aplicación. Esto es un poco engañoso, pero a veces me resulta bastante útil.

UIView *myView = // ... load the view manually or simply [[UIView alloc] initWithFrame:CGRectMake(0,0,100,100)] myViewController.view = myView; [[UIApplication sharedApplication].keyWindow addSubview:myView];

Asegúrese de eliminar la vista en el desmontaje si toma este enfoque. La ventaja de hacer esto es que todos los métodos de ciclo de vida para obtener una vista en la pantalla se invocan automáticamente.

En general, he encontrado que esto es útil para las pruebas en relación con los controladores de vista y las vistas personalizadas que se relacionan con vistas que son partes de diseños de pantalla más grandes. No tanto controladores de vista de nivel superior.

Prueba de UI

Finalmente, existe el nuevo marco de prueba de UI que Apple ha suministrado. He usado marcos de terceros de Ruby como Frank y Calabash en el pasado. Como resultado, Apples UI Testing es realmente bastante bueno y bastante comparable a estas herramientas.

El truco es usarlo para construir una biblioteca de métodos que tengan sentido y ayudar a describir (usando un DSL) varios aspectos de su aplicación.

La desventaja de este enfoque es que no puede simplemente cargar la vista que desea probar. Tienes que ejecutar la aplicación y navegar hacia ella. La otra desventaja principal de esto es que se basa mucho en la vista de accesibilidad externa de su aplicación. Es casi imposible acceder a las partes internas, por lo que las pruebas se basan en el comportamiento de las aplicaciones en la pantalla en lugar de en las clases internas.

Hasta ahora no he explorado la idea de mezclar esta forma de prueba y cargar manualmente vistas en la ventana, pero no veo por qué eso no funcionaría.