J'écris des tests unitaires et, en raison de la nature de cette application, il est important que je monte le plus haut possible dans la chaîne UI
. Donc, ce que je voudrais faire est de déclencher par programmation une pression sur un bouton, comme si l'utilisateur avait appuyé sur le bouton dans le GUI
.
(Oui, oui - je pourrais il suffit d'appeler le sélecteur IBAction
mais, encore une fois, la nature de cette application particulière rend importante le fait que je simule le bouton enfoncé, de sorte que le IBAction
être appelé à partir du bouton, lui-même.)
Quelle est la méthode préférée pour ce faire?
Il se trouve que
[buttonObj sendActionsForControlEvents: UIControlEventTouchUpInside];
m'a donné exactement ce dont j'avais besoin, dans ce cas.
EDIT: N'oubliez pas de le faire dans le fil principal pour obtenir des résultats similaires à ceux d'un utilisateur.
Pour Swift 3:
buttonObj.sendActions(for: .touchUpInside)
Une mise à jour de cette réponse pour Swift
buttonObj.sendActionsForControlEvents(.TouchUpInside)
EDIT : mis à jour pour Swift 3
buttonObj.sendActions(for: .touchUpInside)
Si vous souhaitez effectuer ce type de test, vous allez adorer le support UI Automation dans iOS 4. Vous pouvez écrire du code JavaScript pour simuler des pressions de bouton, etc. assez facilement, bien que la documentation (en particulier la partie de démarrage) clairsemé.
Swift 3:
self.btn.sendActions(for: .touchUpInside)
Dans ce cas, UIButton
est dérivé de UIControl
. Cela fonctionne pour les objets dérivés de UIControl
.
Je voulais réutiliser l'action "UIBarButtonItem
" sur un cas d'utilisation spécifique. Ici, UIBarButtonItem
n'offre pas la méthode sendActionsForControlEvents:
Mais heureusement, UIBarButtonItem
a des propriétés pour target & action.
if(notHappy){
SEL exit = self.navigationItem.rightBarButtonItem.action;
id world = self.navigationItem.rightBarButtonItem.target;
[world performSelector:exit];
}
Ici, rightBarButtonItem
est de type UIBarButtonItem
.
Swift 4:
auto .votreBouton (auto)