无法通过uiviewcontroller的应用程序测试,它是UITextField

时间:2013-11-23 08:46:30

标签: ios objective-c unit-testing testing uiviewcontroller

我想检查(测试) UIViewController 中的 UITextField 是否成为第一响应者

这是我的UIViewController代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [myUITextField becomeFirstResponder];
}

这是我的测试代码:

- (void) testThatMyUITextFieldShouldBeFirstResponder {
    MyViewController * ViewController =
    [[MyViewController alloc] initWithNibName:nil bundle:nil];
    if (MyViewController) {
        [MyViewController loadView];

        STAssertTrue(MyViewController.myUITextField.isFirstResponder, @"myUITextField is not first responder");
    }
}

虽然行[myUITextField becomeFirstResponder]已正确执行但isFirstResponder属性不正确。

问题是什么?如何解决?

3 个答案:

答案 0 :(得分:0)

问题是你在viewDidLoad中将它设置为第一响应者,当de VC没有完成布局子视图时。做它@ viewDidLayoutSubviews,viewWillApear或viewDidapear。然后,@你的测试函数添加[MyViewController.view setNeedsLayout];

答案 1 :(得分:0)

替换这个mathed这将工作正常,当你创建你的文本字段给他们标记5

-(void) testThatMyUITextFieldShouldBeFirstResponder
{
// get your textfield
for (UIView *view in self.view.subviews)
{
    if ([view isKindOfClass:[UITextField class]])
    {
        UITextField *textField=(UITextField *)view;
        // and get if yoyr textfield tag is 5
        if ((textField.tag==5) &&[textField isFirstResponder])
        {
            NSLog(@"Your TextField is Firstrsponder");
        }

    }
}
}

答案 2 :(得分:0)

试试这个:

  1. 将断言声明放在单独的函数中
  2. 使用以下方法延迟后执行该功能。
  3.   

    performSelector:withObject:afterDelay:

    UIViewController在loadView完成执行后调用回调方法viewDidLoad:它在主调度队列上执行。因此,必须在测试功能结束后执行。 (主队列是一个串行队列,其中一个任务需要在开始下一个任务之前完成)

    使用performSelector:时可以避免这种情况,并且可以解决问题。