2010-10-26 69 views
158

我正在编写一些单元测试,并且由于这个特定应用程序的性质,重要的是尽可能高的UI链。所以,我想要做的是以编程方式触发按钮,就好像用户在GUI中按下按钮一样。 (是的,是的 - 我可能只是调用IBAction选择器,但同样,这个特定的应用程序的性质使得我假装实际的按钮按钮,这样的IBAction从按钮调用,这一点很重要,本身)。如何以编程方式将触摸事件伪装成UIButton?

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

+0

你能解释一下为什么你假的按钮触摸,而不是直接调用该操作方法是很重要的?实际上没有实际的区别。 – Jasarien 2010-10-27 00:22:27

+1

@Jasarien:好的,因为有区别!;)在我的应用程序中,几个按钮使用相同的操作方法,并且该方法根据按钮的标签解析如何操作。因此,单元测试除了测试通过该方法的一个特定代码路径外,还需要(a)全部测试它们,并且(b)还验证按钮是否正确连接。另外,它可以很好地提取我的单元测试套件,因为我可以将单元测试定义为文本文件中的行,如下所示:“1 + 2 = 3”其中“3”是预期的结束显示,以及它之前的所有内容是推动哪个按钮。 – Olie 2010-10-27 13:54:57

+0

那么你的操作方法是否有(id)发送者参数?你不能只是调用方法并将按钮作为发送者传递? – Jasarien 2010-10-27 16:09:04

回答

398

事实证明,

[buttonObj sendActionsForControlEvents: UIControlEventTouchUpInside]; 

让我正是我需要的,在这种情况下。

编辑:不要忘了在主线程中这样做,以获得类似于用户按下的结果。


的SWIFT 3:

buttonObj.sendActions(for: .touchUpInside)

+0

这与调用'[myController myActionMethod:myButton1]没有什么不同;' – Jasarien 2010-10-27 16:19:22

+11

你有很大的克制在你的评论回复中;) – 2010-12-14 04:46:42

+3

很好的答案..你救了我......谢谢.. – 2012-06-11 05:00:58

6

如果您想进行这种测试,您将会喜欢iOS 4中的UI自动化支持。您可以很容易地编写JavaScript模拟按钮等,尽管文档(特别是入门部分)有点稀疏。

+1

是的,这是很酷的东西,但我试图从应用程序内部完成,而不是通过乐器(如果这是您的意思)。 – Olie 2010-10-27 13:50:40

+0

Instruments与您的应用程序一起运行。该应用程序仍在运行,乐器只是模拟触摸。 – 2010-10-27 16:57:08

+6

我了解仪器,杰夫 - 我说的是:我希望我的单元测试可以在我的口袋里运行,不需要笔记本电脑或XCode或仪器。或者你知道在设备上运行仪器的秘密吗? ;) – Olie 2010-10-28 04:58:15

5

在这种情况下,UIButtonUIControl的。这适用于源自UIControl的对象。

我想重复使用针对特定用例的“UIBarButtonItem”操作。这里,UIBarButtonItem不提供方法sendActionsForControlEvents:

但幸运的是,UIBarButtonItem有属性为目标&行动。

if(notHappy){   
     SEL exit = self.navigationItem.rightBarButtonItem.action; 
     id world = self.navigationItem.rightBarButtonItem.target; 
     [world performSelector:exit]; 
} 

这里,rightBarButtonItemUIBarButtonItem类型。

+0

如果你使用UIBarButtonItem,你可以[self doAction:self.navigationItem.rightBarButtonItem]; // - doAction:是self.navigationItem.rightBarButtonItem的切换操作名称。 – c0ming 2013-08-15 09:50:06

45

更新到这个答案斯威夫特

buttonObj.sendActionsForControlEvents(.TouchUpInside) 

编辑:更新了斯威夫特3

buttonObj.sendActions(for: .touchUpInside) 
+1

我会这么说:buttonObj.sendActionsForControlEvents(.TouchUpInside)更具有Swift风格;) – Sajjon 2016-02-19 12:25:07

3

对于Xamarin的iOS

btnObj.SendActionForControlEvents(UIControlEvent.TouchUpInside); 

Reference

1

斯威夫特3:

self.btn.sendActions(for: .touchUpInside) 
+1

这只是重复得分较高的答案。 – Pang 2017-07-25 05:58:48

相关问题