我想在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的操作,他们也必须在测试中更改它,或者我们是否需要测试失败并更新测试?
答案 0 :(得分:7)
如果要检查所有目标的所有操作,请将循环与allTargets
一起使用。
当您只想要针对单个已知目标的操作时,您不会使用循环并只使用actionsForTarget:forControlEvent:
。
对于问题的第2部分,您检查的内容取决于您。没人能为你解答。如果您只需确定事件至少有一个操作,请确保actions.count
是一个或多个。
如果您需要确保它有一个操作,并且您需要确保该操作具有特定名称,那么您发布的代码就是您所需要的。