196 votes

Comment simuler de manière programmatique un événement tactile pour un bouton UIB ?

Je suis en train d'écrire des tests unitaires et, en raison de la nature de cette application particulière, il est important que j'arrive aussi haut que possible dans la hiérarchie des tests. UI chaîne que possible. Ce que je voudrais faire, c'est déclencher par programmation une pression sur un bouton, comme si l'utilisateur avait appuyé sur le bouton dans la fenêtre de l'utilisateur. GUI .

(Oui, oui je podría il suffit d'appeler le IBAction mais, encore une fois, la nature de cette application particulière fait qu'il est important que je simule l'appui réel sur le bouton, de telle sorte que le IBAction être appelé à partir du bouton, lui-même).

Quelle est la méthode préférée pour ce faire ?

0 votes

Pourriez-vous expliquer pourquoi il est important de simuler le toucher du bouton plutôt que d'appeler directement la méthode d'action ? Il n'y a pas vraiment de différence pratique.

1 votes

@Jasarien : bien, parce qu'il y a une différence ! ;) Dans mon application, plusieurs boutons utilisent la même méthode d'action, et la méthode analyse comment se comporter en fonction de la balise du bouton. Donc le test unitaire, en plus de tester un chemin de code particulier à travers la méthode, (a) doit les tester tous et (b) vérifie également que les boutons sont correctement câblés. De plus, cela permet de bien abstraire ma suite de tests unitaires, car je peux définir les tests unitaires comme des lignes dans un fichier texte avec quelque chose comme ceci : "1 + 2 = 3" où "3" est l'affichage final attendu, et tout ce qui précède est le bouton à presser.

0 votes

Votre méthode d'action n'a-t-elle pas un paramètre (id)sender ? Ne pourriez-vous pas simplement appeler la méthode et passer le bouton comme expéditeur ?

477voto

Olie Points 10528

Il s'avère que

[buttonObj sendActionsForControlEvents:UIControlEventTouchUpInside];

m'a permis d'obtenir exactement ce dont j'avais besoin, dans ce cas.

EDIT : N'oubliez pas de le faire dans le fil de discussion principal, pour obtenir des résultats similaires à ceux d'une presse utilisateur.


Pour Swift 3 :

buttonObj.sendActions(for: .touchUpInside)

0 votes

Ce qui n'est pas différent d'appeler [myController myActionMethod:myButton1];

12 votes

Vous faites preuve d'une grande retenue dans vos réponses aux commentaires ;)

0 votes

@Jasarien est assez différent, car il enverra l'événement tactile à toutes les cibles enregistrées (auditeurs).

52voto

Hellojeffy Points 49

Une mise à jour de cette réponse pour Swift

buttonObj.sendActionsForControlEvents(.TouchUpInside)

EDIT : Mise à jour pour Swift 3

buttonObj.sendActions(for: .touchUpInside)

8voto

gobi Points 451

Swift 3 :

self.btn.sendActions(for: .touchUpInside)

6voto

Jeff Kelley Points 12893

Si vous souhaitez effectuer ce type de tests, vous adorerez la prise en charge de l'automatisation de l'interface utilisateur dans iOS 4. Vous pouvez écrire du JavaScript pour simuler des pressions sur des boutons, etc. assez facilement, bien que la documentation (surtout la partie de démarrage) soit un peu maigre.

1 votes

Oui, c'est cool, mais j'essaie de le faire à partir de l'application, pas via Instruments (si c'est la méthode dont vous parlez).

0 votes

Les instruments fonctionnent avec votre application. L'application est toujours en cours d'exécution, Instruments ne fait que simuler le toucher.

6 votes

Je comprends Instruments, Jeff -- ce que je veux dire c'est : je veux que mes tests unitaires s'exécutent dans l'appareil que j'ai dans ma poche, sans avoir un ordinateur portable ou XCode ou Instruments à portée de main. Ou bien connaissez-vous le secret de l'exécution des instruments sur l'appareil ? ;)

5voto

HDA Points 2590

Pour Xamarin iOS

btnObj.SendActionForControlEvents(UIControlEvent.TouchUpInside);

Référence

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X