2013-12-10 66 views
1

我正在使用XCtest測試視圖標題。試圖先養成寫測試的習慣。安裝看起來像使用XCTest測試視圖標題

- (void)setUp 
{ 
    [super setUp]; 
    self.appDelegate = [[UIApplication sharedApplication] delegate]; 
    self.tipViewController = self.appDelegate.tipViewController; 
    self.tipView = self.tipViewController.view; 

    self.settingsViewController = self.appDelegate.settingsViewController; 
    self.settingsView = self.settingsViewController.view; 
} 

問題是「settingsViewController」。我有兩個功能用於實際測試:

- (void) testTitleOfMainView{ 
    XCTAssertTrue([self.tipViewController.title isEqualToString:@"Tip Calculator"], @"The title should be Tip Calculator"); 
    //why does this not work? 
    // XCTAssertEqual(self.tipViewController.title, @"Tip Calculator", @"The title should be Tip Calculator"); 
} 

- (void) testTitleOfSettingsView{ 
    //make the setttings view visible 
    [self.tipViewController onSettingsButton]; 

    //test the title 
    XCTAssertTrue([self.settingsViewController.title isEqualToString:@"Settings"], @"The title should be Settings"); 
} 

「testTitleOfMainView」的作品。但隨着self.settingsViewController爲零的「testTitleOfSettingsView失敗。我有點明白爲什麼。該視圖尚未初始化尚未。所以,我想送帶來鑑於settignscontroller消息給主控制器

[self.tipViewController onSettingsButton]; 

的settingsController仍然是零。我應該用嘲弄?有人認爲這對我的其他問題 xctest - how to test if a new view loads on a button press

我應該繼承的settingsview和手動把它?謝謝。

回答

8

保持遠離實際加載的意見在一個真正的導航疊加。真正的UI交互通常需要運行循環來接收事件,所以它們不能用於快速單元測試。所以扔掉你的setUp代碼。

相反,實例化自身的視圖控制器,並將其負載:

- (void)testTitleOfSettingsView 
{ 
    SettingsViewController *sut = [[SettingsViewController alloc] init]; 

    [sut view]; // Accessing the view causes it to load 

    XCTAssertEquals(@"Settings", sut.title); 
} 

另外,瞭解了可用於您在XCTest,不只是XCAssertTrue各種斷言。避免在這些斷言中發表評論;一個小測試中的一個斷言應該說明問題。

+0

再次感謝你喬恩!我是否需要測試真正的交互?即使如此,我也會嘲笑它,我想你就是在另一個問題中展示的。 –

+0

一般來說,不要害怕使用真正的互動,只要它們速度快並且不會造成持續的變化(這會弄亂其他測試)。換句話說,避免網絡,文件系統或持久性數據庫。 –

+0

謝謝喬恩。我正在關注TDD上的youtube系列。非常適合像我這樣的新手! –