2

我正在尝试在Xcode中为计算器编写一个单元测试用例,目前我正在为 add 函数编写测试用例。 这是我的数字按下功能:

- (IBAction)digitPressed:(UIButton *)sender.

我看过一个例子,如果方法名称是

- (IBAction)digitPressed:(id)sender,     

您可以在视图标签的帮助下调用该函数,例如

[calc_view_controller digitPressed:[calc_view viewWithTag:6];   

上面在实现部分定义的实例为

app_delegate         = [[UIApplication sharedApplication] delegate];
calc_view_controller = app_delegate.viewController;
calc_view            = calc_view_controller.view;

现在因为我的按钮类型是(UIButton *)我不能使用view标签,还有其他UIButton类型的替代品吗?
如果是这样,你能给我举个例子吗?

4

3 回答 3

2

按钮是一个视图,所以-viewWithTag:会发现它很好。唯一的问题是您的sender类型与返回的类型不一致-viewWithTag:,但是如果您确定要返回的视图是一个按钮,则可以通过强制转换来解决这个问题,或者您可以先检查:

[calc_view digitPressed:(UIButton*)[calc_view viewWithTag:6]];

或者:

UIButton *button = (UIButton*)[calc_view viewWithTag:6]];
if ([button isKindOfClass:[UIButton class]]) {
    [calc_view digitPressed:button];
}

要么在实践中有效;后者更安全,并且可以轻松添加额外的测试:如果按钮不是 UIButton,则测试可能会失败。

于 2013-07-29T11:54:56.560 回答
1

你这样做不好,你不应该比较 sender.titleLabel.text。想想当您更改标签文本时会发生什么,因为例如您必须以另一种语言发布您的应用程序。

但是,如果您仍想以这种方式处理按钮识别,则必须在单元测试中创建 UIButton 并将其设置为正确的标签文本值。

于 2013-07-29T12:00:43.373 回答
0

我不会调用方法,而是调用执行IBAction加法的特定方法。

您可以在这里测试很多东西,例如:

  1. UIButton对象向digitPressed方法发送正确的值
  2. digitPressed方法正确地从对象中提取值UIButton并将该值传递给该add方法
  3. add方法的结果是您所期望的

你测试多少取决于你,我个人不会太挂在 1 和 2 上。如果其中任何一个的逻辑是错误的,它就会变得很明显,并且它们不太可能引起回归。

对我来说,更重要的是全面测试该add方法。发送大量常见案例、边缘案例和边界值,而不用担心来自UIButton媒体的流量。

于 2013-07-29T11:38:56.273 回答