我想在UIView上测试具有正确处理程序的UIbutton。
我见过的一种方法是:
NSArray *actions = [loginVC.registerBtn actionsForTarget:target forControlEvent:UIControlEventTouchUpInside];
actionForTraget
当发生指定事件时,根据apple返回的操作将对目标对象执行。
但是我看到的另一种方式是循环并检查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的操作,则他们也必须在测试中进行更改,还是我们需要进行测试以使测试失败并更新测试?
allTargets
如果要检查所有目标的所有操作,请使用循环。
您不使用循环,仅actionsForTarget:forControlEvent:
在只希望针对单个已知目标执行操作时使用。
对于问题的第二部分,您要检查的内容由您决定。没有人可以为您回答。如果您只需要确定该事件至少有一个动作,则只需确定actions.count
一个或多个动作即可。
如果您需要确保它具有动作,并且需要确保该动作具有特定名称,那么您所需要的代码就是您所需要的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句