单元测试按钮单击不起作用

时间:2016-05-05 18:21:15

标签: ios objective-c unit-testing

我已经以编程方式添加了一个按钮,我必须为自动化过程运行单元测试。我们没有太多的UI组件,因此我们不使用UI测试包。

在代码中添加了按钮

self.proceedButton.frame = CGRectMake(0.0, 0.0, (buttonContainerWidth * 0.75), (buttonContainerHeight * 0.3));
self.proceedButton.center = CGPointMake(self.buttonContainer.center.x, CGRectGetHeight(self.proceedButton.frame));
self.proceedButton.layer.cornerRadius = CGRectGetHeight(self.proceedButton.frame) / 2;
self.proceedButton.layer.masksToBounds = YES;
self.proceedButton.titleLabel.font = proceedFont;
[self.proceedButton addTarget:self action:@selector(onAcceptClicked) forControlEvents:UIControlEventTouchUpInside];

测试:

[vc viewDidLoad];
NSString *selector = [[vc.proceedButton actionsForTarget:vc forControlEvent:UIControlEventTouchUpInside] firstObject];
XCTAssert([selector isEqualToString:@"onAcceptClicked"]);
[vc.proceedButton sendActionsForControlEvents: UIControlEventTouchUpInside];

如果我注释掉[self.proceedButton addTarget:self action:@selector(onAcceptClicked) forControlEvents:UIControlEventTouchUpInside];行,则会失败,因此测试似乎写得正确。

但是sendActionsForControlEvents:未在测试中输入onAcceptClicked方法。

为什么会这样?是否有可能在实际调用onAcceptClicked之前完成单元测试?

1 个答案:

答案 0 :(得分:0)

这可能是因为您直接调用[vc viewDidLoad]Apple advises you not to do,可能是因为最终调用viewDidLoad之前执行了一系列设置。

  

你永远不应该直接调用这个方法。视图控制器在请求其view属性但当前为nil时调用此方法。此方法加载或创建视图并将其分配给view属性。

相反,请尝试在开头使用XCTAssertNotNil(vc.view);。这将尝试加载视图,最终为您调用viewDidLoad,并可能设置您的按钮,以便正确添加操作。

编辑因此,如果有帮助,我只是快速运行此测试,并且我可以验证在测试运行时在视图控制器中调用方法onAcceptClicked。 / p>

viewDidLoad

中的按钮设置
CGRect frame = CGRectMake(50, 40, 30, 30);
self.proceedButton = [[UIButton alloc] initWithFrame:frame];
self.proceedButton.titleLabel.text = @"button!!!!";
[self.proceedButton addTarget:self action:@selector(onAcceptClicked) forControlEvents:UIControlEventTouchUpInside];
self.proceedButton.backgroundColor = [UIColor blackColor];
[self.view addSubview:self.proceedButton];

<强>测试

-(void)testButton {
    self.myVC = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"MyVC"];
    XCTAssertNotNil(self.myVC.view);
    NSString *selector = [[self.myVC.proceedButton actionsForTarget:self.myVC forControlEvent:UIControlEventTouchUpInside] firstObject];
    XCTAssert([selector isEqualToString:@"onAcceptClicked"]);
    [self.myVC.proceedButton sendActionsForControlEvents: UIControlEventTouchUpInside];
}