我正在编写一些单元测试,由于这个特定应用的性质,重要的是我尽可能地深入到UI层面。因此,我想以编程方式触发按钮按下事件,就像用户在GUI中按下按钮一样。
(是的,我可以调用IBAction选择器,但是这个特定应用的性质使得我必须伪造实际的按钮按下操作,以便从按钮本身调用IBAction)
怎么做才是首选方法呢?
我正在编写一些单元测试,由于这个特定应用的性质,重要的是我尽可能地深入到UI层面。因此,我想以编程方式触发按钮按下事件,就像用户在GUI中按下按钮一样。
(是的,我可以调用IBAction选择器,但是这个特定应用的性质使得我必须伪造实际的按钮按下操作,以便从按钮本身调用IBAction)
怎么做才是首选方法呢?
结果是
[buttonObj sendActionsForControlEvents:UIControlEventTouchUpInside];
这个确切地给了我我所需要的东西。
编辑: 别忘了在主线程中执行,以获得类似用户按下的结果。
针对Swift 3:
buttonObj.sendActions(for: .touchUpInside)
myActionMethod:
不是公共的,因此您无法直接调用它。 - Iulian OnofreibuttonObj.SendActionForControlEvents(UIControlEvent.TouchUpInside);
Xamarin:buttonObj.SendActionForControlEvents(UIControlEvent.TouchUpInside);
- Pierre关于Swift的更新
buttonObj.sendActionsForControlEvents(.TouchUpInside)
编辑: 已更新为 Swift 3 版本。
buttonObj.sendActions(for: .touchUpInside)
Swift 3:
self.btn.sendActions(for: .touchUpInside)
如果您想进行这种类型的测试,您会喜欢iOS 4中的UI自动化支持。您可以编写JavaScript来模拟按钮按下等操作,尽管文档(特别是入门部分)有点简略。
UIButton
派生自 UIControl
。对于从 UIControl
派生的对象,这是有效的。UIBarButtonItem
" 动作。在这里,UIBarButtonItem
并没有提供方法 sendActionsForControlEvents:
但幸运的是,UIBarButtonItem
有目标和动作属性。 if(notHappy){
SEL exit = self.navigationItem.rightBarButtonItem.action;
id world = self.navigationItem.rightBarButtonItem.target;
[world performSelector:exit];
}
rightBarButtonItem
是类型为 UIBarButtonItem
的对象。Swift 5:
class ViewController: UIViewController {
@IBOutlet weak var theTextfield: UITextField!
@IBOutlet weak var someButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
theTextfield.text = "Pwd"
someButton.sendActions(for: .touchUpInside)
}
@IBAction func someButtonTap(_ sender: UIButton) {
print("button tapped")
}
}
对于那些编写单元测试而不是 UI 测试的人来说,这很方便;-)
在 Swift 5 中解决 UIBarButtonItem
的问题的方法,因为它没有像 UIButton 等控件一样的 sendAction
方法。
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)
}
}
let action = UIBarButtonItem(title: "title", style: .done, target: self, action: #selector(doSomething))
action.sendAction()
Swift 4:
self.yourButton(self)