我正在编写一些单元测试,并且由于这个特定应用程序的性质,重要的是尽可能高的UI链。所以,我想要做的是以编程方式触发按钮,就好像用户在GUI中按下按钮一样。 (是的,是的 - 我可能只是调用IBAction选择器,但同样,这个特定的应用程序的性质使得我假装实际的按钮按钮,这样的IBAction从按钮调用,这一点很重要,本身)。如何以编程方式将触摸事件伪装成UIButton?
这样做的首选方法是什么?
我正在编写一些单元测试,并且由于这个特定应用程序的性质,重要的是尽可能高的UI链。所以,我想要做的是以编程方式触发按钮,就好像用户在GUI中按下按钮一样。 (是的,是的 - 我可能只是调用IBAction选择器,但同样,这个特定的应用程序的性质使得我假装实际的按钮按钮,这样的IBAction从按钮调用,这一点很重要,本身)。如何以编程方式将触摸事件伪装成UIButton?
这样做的首选方法是什么?
事实证明,
[buttonObj sendActionsForControlEvents: UIControlEventTouchUpInside];
让我正是我需要的,在这种情况下。
编辑:不要忘了在主线程中这样做,以获得类似于用户按下的结果。
的SWIFT 3:
buttonObj.sendActions(for: .touchUpInside)
这与调用'[myController myActionMethod:myButton1]没有什么不同;' – Jasarien 2010-10-27 16:19:22
你有很大的克制在你的评论回复中;) – 2010-12-14 04:46:42
很好的答案..你救了我......谢谢.. – 2012-06-11 05:00:58
如果您想进行这种测试,您将会喜欢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
类型。
如果你使用UIBarButtonItem,你可以[self doAction:self.navigationItem.rightBarButtonItem]; // - doAction:是self.navigationItem.rightBarButtonItem的切换操作名称。 – c0ming 2013-08-15 09:50:06
更新到这个答案斯威夫特
buttonObj.sendActionsForControlEvents(.TouchUpInside)
编辑:更新了斯威夫特3
buttonObj.sendActions(for: .touchUpInside)
我会这么说:buttonObj.sendActionsForControlEvents(.TouchUpInside)更具有Swift风格;) – Sajjon 2016-02-19 12:25:07
你能解释一下为什么你假的按钮触摸,而不是直接调用该操作方法是很重要的?实际上没有实际的区别。 – Jasarien 2010-10-27 00:22:27
@Jasarien:好的,因为有区别!;)在我的应用程序中,几个按钮使用相同的操作方法,并且该方法根据按钮的标签解析如何操作。因此,单元测试除了测试通过该方法的一个特定代码路径外,还需要(a)全部测试它们,并且(b)还验证按钮是否正确连接。另外,它可以很好地提取我的单元测试套件,因为我可以将单元测试定义为文本文件中的行,如下所示:“1 + 2 = 3”其中“3”是预期的结束显示,以及它之前的所有内容是推动哪个按钮。 – Olie 2010-10-27 13:54:57
那么你的操作方法是否有(id)发送者参数?你不能只是调用方法并将按钮作为发送者传递? – Jasarien 2010-10-27 16:09:04