2011-12-31 98 views
2

其实我觉得有点不好意思问这个,因为感觉大约为基本,你可以走了,但它已经绊倒了我好几个小时......iPhone测试:测试IBOutlets

比方说,我有一个UIViewController的实例(称为MyViewController),它只有一个IBOutlet到UITextField,并且当页面加载时,我将它设置为Enabled或不基于BOOL属性。

- (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?目前它一直告诉我,姓氏textfield未启用。

感谢您的帮助和新年快乐!

回答

3

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

+0

非常感谢你Max - 你是一个明星。调用视图属性并没有真正解决问题(它产生了一个单独的错误),但手动调用loadView工作。非常感谢您的解释 - 我认为该视图已被自动加载,所以您所说的将所有内容置于原地。我希望你有一个神话般的2012年! – 2011-12-31 10:55:06

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,否则将使用默认值覆盖它。

+0

谢谢Krizz - Max上面的解决方案调用了loadView,但我也很感谢你的回复和解释。您对订购的要求非常正确 - 对不起,如果我也能接受您的答案,我会但我只能接受一个 - 所以请接受我对您的答复表示感谢并祝您2012年精彩纷呈。 – 2011-12-31 10:58:59

+0

但是你是否注意到了下面的摘录:_“你不应该直接调用这个方法,视图控制器在请求视图属性时调用这个方法,但是当前为nil。”_ loadView'方法的描述[here]( http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html)? – Krizz 2012-01-02 17:21:54

+0

使用'[myController视图]'而不是'[myController loadView] – 2012-01-13 17:44:33

0

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