【问题标题】:How to check UIButton has target?如何检查 UIButton 是否有目标?
【发布时间】:2016-07-31 11:07:01
【问题描述】:

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

我见过的一种方法是:

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

根据苹果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 的操作,他们也必须在测试中更改它,还是我们需要让测试失败并更新测试?

【问题讨论】:

标签: ios objective-c uibutton xctest


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多