如何检查UIButton有目标?

时间:2016-04-10 11:35:25

标签: ios objective-c uibutton xctest

我想在UIView上测试一个UI按钮有合适的处理程序。

我看到的一种方法是:

NSArray *actions = [loginVC.registerBtn actionsForTarget:target forControlEvent:UIControlEventTouchUpInside];

根据apple actionForTraget返回指定事件发生时对目标对象执行的操作。

但我看到的其他方式是有一个循环并检查allTargets:

for (id target in loginVC.registerBtn.allTargets) {
        NSArray *actions = [loginVC.registerBtn actionsForTarget:target forControlEvent:UIControlEventTouchUpInside];
        XCTAssertEqual(actions.count, 1);
        SEL handler = NSSelectorFromString(actions[0]);
        XCTAssertTrue([loginVC respondsToSelector:handler]);
    }

据苹果参考:

allTargets:返回与控件关联的所有目标对象。

没有循环有什么区别。我们何时需要循环它以及何时需要获取actionForTarget?

我的问题的第二部分只是我们需要检查我们的按钮是否有目标,或者还要检查连接哪个方法以执行以下操作:

NSArray *actions = [loginVC.registerBtn actionsForTarget:target forControlEvent:UIControlEventTouchUpInside]; 
XCTAssertTrue([actions containsObject:@"onRegisterButtonPressed:"]);

最佳做法是什么?

如果开发人员更改了不同的方法来处理UIButton的操作,他们也必须在测试中更改它,或者我们是否需要测试失败并更新测试?

1 个答案:

答案 0 :(得分:7)

如果要检查所有目标的所有操作,请将循环与allTargets一起使用。

当您只想要针对单个已知目标的操作时,您不会使用循环并只使用actionsForTarget:forControlEvent:

对于问题的第2部分,您检查的内容取决于您。没人能为你解答。如果您只需确定事件至少有一个操作,请确保actions.count是一个或多个。

如果您需要确保它有一个操作,并且您需要确保该操作具有特定名称,那么您发布的代码就是您所需要的。