iPhone测试:测试IBOutlets

时间:2011-12-31 09:23:20

标签: objective-c ios ocunit

我实际上觉得有点尴尬地问这个,因为它感觉就像你可以去的那样基本,但它已经让我困扰了好几个小时......

假设我有一个UIViewController的实例(称为MyViewController),它只有一个IBOutlet到UITextField,当页面加载时,我或者根据BOOL属性将其设置为Enabled。

- (void)viewDidLoad {
    [super viewDidLoad];
    self.surname.enabled = self.allowTextField;
}

所有东西都正确连线,当我运行应用程序时,它按预期工作(主 - 我希望如此,因为如果我不能正确使用那部分,我可能不应该编写iPhone应用程序......) 。

无论如何,我决定勤奋并为应用程序编写应用程序单元测试,因为这是我想要变得更加坚实的东西。不幸的是,我不能为我的生活理解为什么以下不起作用...

-(void)testFieldEnabled {
    MyViewController *myController = [[MyViewController alloc] initWithNibName:nil bundle:nil];
    myController.allowTextField = YES;
    [myController viewDidLoad];
     STAssertTrue(myController.surname.enabled, @"Why is this not correct?");
}

我保持这个例子非常简单,因为我真的不明白为什么这不起作用,并且相信它必定是因为我对单元测试的理解失败了。不应该上面的单元测试启动一个MyViewController页面的实例,设置属性,运行方法并返回true?目前,它一直告诉我没有启用姓氏文本字段。

感谢您的帮助,祝大家新年快乐!

3 个答案:

答案 0 :(得分:3)

这是因为手动调用viewDidLoad实际上并不加载视图。您应该调用视图控制器的视图属性,它将自动加载视图(或手动调用loadView)。

答案 1 :(得分:3)

尝试以下方法:

-(void)testFieldEnabled {
   MyViewController *myController = [[MyViewController alloc] initWithNibName:nil bundle:nil];
   [myController view];
   myController.allowTextField = YES;
   STAssertTrue(myController.surname.enabled, @"Why is this not correct?");
}

viewDidLoad只会使用您的初始化代码调用您的委托方法。它不会做任何实际的视图加载。 此外,您需要在加载视图后设置allowTextField,否则将使用默认值覆盖它。

答案 2 :(得分:0)

您可以使用'加载视图'而不是视图加载。您还必须在“我的视图控制器”中描述“加载视图”