2010-10-26 22 views
158

Estoy escribiendo algunas pruebas de unidad y, debido a la naturaleza de esta aplicación en particular, es importante que llegue lo más arriba posible de la cadena de interfaz de usuario. Entonces, lo que me gustaría hacer es activar programáticamente una pulsación de botón, como si el usuario hubiera presionado el botón en la GUI.cómo falsificar mediante programación un evento táctil a un UIButton?

(Sí, sí - Yo podía simplemente llamar al selector de IBAction pero, de nuevo, la naturaleza de esta aplicación en particular hace que sea importante que la falsa pulse el botón real, de manera que la IBAction ser llamado desde el botón, sí mismo.)

¿Cuál es el método preferido de hacer esto?

+0

Podría explicar por qué es importante que el falso botón táctil en lugar de llamar al método de acción directa? Realmente no hay diferencia práctica. – Jasarien

+1

@Jasarien: ¡bien, porque hay una diferencia!;) En mi aplicación, varios botones usan el mismo método de acción, y el método analiza cómo comportarse en función de la etiqueta del botón. Por lo tanto, la prueba unitaria, además de probar una ruta de código particular a través del método, (a) debe probarlos todos y (b) también verifica que los botones estén conectados correctamente. Además, abstrae muy bien mi suite de pruebas unitarias, ya que puedo definir las pruebas unitarias como líneas en un archivo de texto con algo como esto: "1 + 2 = 3" donde "3" es la visualización final esperada, y todo lo anterior. es qué botón presionar. – Olie

+0

¿No tiene su método de acción un parámetro de remitente (id)? ¿No podría simplemente llamar al método y pasar el botón como remitente? – Jasarien

Respuesta

398

Resulta que

[buttonObj sendActionsForControlEvents: UIControlEventTouchUpInside]; 

me dieron exactamente lo que necesitaba, en este caso.

EDITAR: No olvide hacer esto en el hilo principal, para obtener resultados similares a una pulsación del usuario.


Para Swift 3:

buttonObj.sendActions(for: .touchUpInside)

+0

Lo cual no es diferente de llamar a '[myController myActionMethod: myButton1];' – Jasarien

+11

tiene gran restricción en las respuestas de sus comentarios;) –

+3

Gran respuesta ... me salvaste ... gracias .. –

6

Si desea hacer este tipo de pruebas, le encantará el soporte de automatización de UI en iOS 4. Puede escribir JavaScript para simular pulsaciones de botones, etc. con bastante facilidad, aunque la documentación (especialmente la parte de inicio)) es un poco escaso.

+1

Sí, eso es genial, pero estoy tratando de hacerlo desde la aplicación, no a través de instrumentos (si ese es el método que quieres decir). – Olie

+0

Instruments se ejecuta con tu aplicación. La aplicación todavía se está ejecutando, Instruments simplemente simula el toque. –

+6

Entiendo los instrumentos, Jeff, lo que digo es que quiero que mis pruebas unitarias se ejecuten en el dispositivo en mi bolsillo, sin una computadora portátil o XCode o instrumentos a mano. ¿O conoce el secreto de ejecutar instrumentos en el dispositivo? ;) – Olie

5

En este caso, UIButton se deriva de UIControl. Esto funciona para el objeto derivado de UIControl.

Quería reutilizar la acción "UIBarButtonItem" en un caso de uso específico. Aquí, UIBarButtonItem no ofrece el método sendActionsForControlEvents:

Pero afortunadamente, UIBarButtonItem tiene propiedades para el objetivo & acción.

if(notHappy){   
     SEL exit = self.navigationItem.rightBarButtonItem.action; 
     id world = self.navigationItem.rightBarButtonItem.target; 
     [world performSelector:exit]; 
} 

Aquí, rightBarButtonItem es de tipo UIBarButtonItem.

+0

si usa UIBarButtonItem, puede simplemente [self doAction: self.navigationItem.rightBarButtonItem]; // - doAction: es el nombre de la acción de alternar de self.navigationItem.rightBarButtonItem. – c0ming

45

Una actualización a esta respuesta de Swift

buttonObj.sendActionsForControlEvents(.TouchUpInside) 

EDITAR: Actualización de Swift 3

buttonObj.sendActions(for: .touchUpInside) 
+1

Diría que: buttonObj.sendActionsForControlEvents (.TouchUpInside) es aún más estilo Swift;) – Sajjon

3

Para Xamarin iOS

btnObj.SendActionForControlEvents(UIControlEvent.TouchUpInside); 

Reference

1

Swift 3:

self.btn.sendActions(for: .touchUpInside) 
+1

Esto solo repite las respuestas más altas. – Pang

Cuestiones relacionadas