如何检查 UIButton 是否有目标?

How to check UIButton has target?

我想测试 UIView 上的 UIbutton 是否有正确的处理程序。

我见过的一种方法是:

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

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

但我看到的另一种方式是循环并检查 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 : Returns 与控件关联的所有目标对象。

没有循环有什么区别。我们什么时候需要循环它,什么时候只需要获取 actionForTarget?

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

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

最佳做法是什么?

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

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

当您只需要对单个已知目标执行操作时,请不要使用循环,只需使用 actionsForTarget:forControlEvent:

对于你问题的第二部分,你检查什么取决于你。没有人可以为你回答这个问题。如果您只需要确定事件至少有一项操作,只需确保 actions.count 是一项或多项即可。

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