J'écris des tests unitaires et, en raison de la nature de cette application particulière, il est important que je monte le plus haut possible dans la UI
chaîne. Donc, ce que j'aimerais faire, c'est déclencher par programme une pression sur un bouton, comme si l'utilisateur avait appuyé sur le bouton dans le GUI
.
(Oui, oui - je pourrais simplement appeler le IBAction
sélecteur mais, encore une fois, la nature de cette application particulière fait qu'il est important que je simule la pression réelle du bouton, de sorte que l' IBAction
appel soit appelé à partir du bouton lui-même.)
Quelle est la méthode préférée pour faire cela?
Réponses:
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 de discussion principal, pour obtenir des résultats similaires à ceux d'une presse utilisateur.
Pour Swift 3:
buttonObj.sendActions(for: .touchUpInside)
la source
[myController myActionMethod:myButton1];
myActionMethod:
n'est pas public, et vous ne pouvez donc pas l'appeler directement.Une mise à jour de cette réponse pour Swift
buttonObj.sendActionsForControlEvents(.TouchUpInside)
EDIT : mis à jour pour Swift 3
buttonObj.sendActions(for: .touchUpInside)
la source
Swift 3:
self.btn.sendActions(for: .touchUpInside)
la source
Si vous voulez faire ce type de test, vous adorerez le support UI Automation dans iOS 4. Vous pouvez écrire du JavaScript pour simuler les pressions sur des boutons, etc. assez facilement, bien que la documentation (en particulier la partie de démarrage) soit un peu clairsemé.
la source
Dans ce cas,
UIButton
est dérivé deUIControl
. Cela fonctionne pour les objets dérivés deUIControl
.Je voulais réutiliser l'
UIBarButtonItem
action " " sur un cas d'utilisation spécifique. Ici,UIBarButtonItem
n'offre pas de méthodesendActionsForControlEvents:
Mais heureusement,
UIBarButtonItem
a des propriétés pour la cible et l'action.if(notHappy){ SEL exit = self.navigationItem.rightBarButtonItem.action; id world = self.navigationItem.rightBarButtonItem.target; [world performSelector:exit]; }
Ici,
rightBarButtonItem
c'est de typeUIBarButtonItem
.la source
Pour Xamarin iOS
btnObj.SendActionForControlEvents(UIControlEvent.TouchUpInside);
Référence
la source
C'est pratique pour les personnes qui écrivent des tests unitaires sans tests d'interface utilisateur ;-)
Swift 5 façon de le résoudre
UIBarButtonItem
, qui n'a pas desendAction
méthode comme UIButton etc.extension UIBarButtonItem { func sendAction() { guard let myTarget = target else { return } guard let myAction = action else { return } let control: UIControl = UIControl() control.sendAction(myAction, to: myTarget, for: nil) } }
Et maintenant, vous pouvez simplement:
let action = UIBarButtonItem(title: "title", style: .done, target: self, action: #selector(doSomething)) action.sendAction()
la source
Swift 4:
self .yourButton (self)
la source