197

我正在编写一些单元测试,并且由于这个特定应用程序的性质,我尽可能地在UI链上获得高位是很重要的。所以,我想做的是以编程方式触发按钮按下,就好像用户按下了GUI.

(是的,是的——我可以只调用IBAction选择器,但同样,这个特定应用程序的性质使得我伪造实际的按钮按下很重要,以便IBAction从按钮本身调用。)

这样做的首选方法是什么?

4

9 回答 9

479

事实证明

[buttonObj sendActionsForControlEvents:UIControlEventTouchUpInside];

在这种情况下,我得到了我需要的东西。

编辑:不要忘记在主线程中执行此操作,以获得类似于用户按下的结果。


对于斯威夫特 3:

buttonObj.sendActions(for: .touchUpInside)
于 2010-10-27T13:56:24.793 回答
52

Swift 这个答案的更新

buttonObj.sendActionsForControlEvents(.TouchUpInside)

编辑:为 Swift 3 更新

buttonObj.sendActions(for: .touchUpInside)
于 2015-02-01T00:49:38.377 回答
8

斯威夫特 3:

self.btn.sendActions(for: .touchUpInside)
于 2017-02-15T06:41:28.403 回答
6

如果你想做这种测试,你会喜欢 iOS 4 中的 UI 自动化支持。你可以很容易地编写 JavaScript 来模拟按钮按下等,尽管文档(尤其是入门部分)有点疏。

于 2010-10-27T00:27:03.033 回答
5

在这种情况下,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

于 2012-06-28T11:44:55.943 回答
5

对于 Xamarin iOS

btnObj.SendActionForControlEvents(UIControlEvent.TouchUpInside);

参考

于 2017-02-14T13:06:18.653 回答
3

斯威夫特 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")
    }
}
于 2021-03-17T11:04:40.080 回答
1

这对于编写没有 UI 测试的单元测试的人来说很方便;-)

Swift 5 解决它的方法UIBarButtonItem,它没有sendActionUIButton 等方法。

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()
于 2020-07-20T10:21:31.620 回答
-4

斯威夫特 4:

自我 .yourButton(self)

于 2019-08-22T19:02:26.230 回答