2011-12-31 99 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'