2

我想編寫集成應用程序測試以測試完整的CRUD操作。我有一個表格視圖來列出所有的對象。用戶可以點擊「添加」按鈕推送一個新的詳細視圖控制器添加一個新的對象;他們可以點擊現有對象來推送詳細視圖控制器來重命名對象;他們也可以從列表中刪除對象。OCUnit使用UINavigationController和UITableView測試我的應用程序

我很高興嘗試OCUnit來測試我的應用程序。但是,我遇到了一些奇怪的錯誤。我正在使用UITabBarController + UINavigationController。我的UINavigationController中有3個以上的pushViewController級別。如果我測試代碼,因爲它與[self.navigationController pushViewController:的viewController動畫:是],它主要有兩個警告作品:

nested push animation can result in corrupted navigation bar 
nested pop animation can result in corrupted navigation bar 

我注意到viewDidAppear並不因此稱爲警告。

然後我試着通過改變動畫:YES來動畫:NO。警告消失。但是,我遇到了另一個bug,其中viewDidLoad根本沒有被調用。所以視圖不會從NIB文件加載,所有IB控件都是零。如果我將動畫設置爲YES,情況並非如此。

這是我用來獲取UINavigationController中的根視圖控制器句柄的代碼。

app = (MyAppDelegate*) [[UIApplication sharedApplication] delegate]; 
rootVC = ((MyViewController*)[[((UINavigationController*)[app.tabBarController.viewControllers objectAtIndex:0]) viewControllers] objectAtIndex:0]); 

我手動調用該代碼在我的測試,以模擬在UITableView的一個點擊:

[rootVC tableView:rootVC.tableView didSelectRowAtIndexPath:ip]; // push is called inside this 

所以我堅持要麼我設置動畫:是或動畫:NO。有沒有人成功使用OCUnit來測試使用UINavigationController + UITableView的應用程序?如果是這樣,請你分享一些示例代碼或你的經驗?

+0

很難說出你想測試的東西 - 特定的視圖控制器是否被推送? –

回答

7

首先,對於單元測試,不要從您的應用程序委託中獲取您的根視圖控制器。實際的根視圖控制器是單例,單元測試中的單例創建了測試間依賴關係。相反,讓測試設置(並拆除)它自己的視圖控制器實例。

某些類型的測試需要視圖控制器加載它的筆尖 - 例如,創建表視圖。對於這些測試,呼叫

[rootVC view]; 

要測試一個視圖控制器推,用你的實際視圖控制器的測試子類並覆蓋navigationController返回一個模擬對象,你可以驗證。例如,

@interface TestingMyViewController : MyViewController 
@property(nonatomic, assign) UINavigationController *mockNavigationController; 
@end 

@implementation TestingMyViewController 

@synthesize mockNavigationController; 

- (UINavigationController *)navigationController 
{ 
    return mockNavigationController; 
} 

@end 

然後讓您的測試創建一個TestingMyViewController和一個模擬。設置模擬,並將其分配給測試子類。調用您想要測試的方法,然後驗證模擬導航控制器是否接收到您期望的調用,並使用您所期望的參數。

+0

感謝您的提示。對不起,我以前的問題是誤導性的。我其實想寫集成應用程序測試。有點像在UIAutomation中寫Javascript來端到端測試。 OCUnit能夠完成這項工作嗎?還是我最好在儀器中切換到UIAutomation? –

+1

啊。對於集成測試,除了使用OCUnit或任何其他單元測試框架外,我還會使用其他軟件。 UIAutomation是一種方法。另一種值得研究的方法是Frank + Cucumber:http://blog.thepete.net/2010/07/frank-automated-acceptance-tests-for。html –

+0

這樣做會使測試通過,但在使用應用程序時,即使仍然調用navigationController方法,視圖控制器也不會再被導航控制器壓入。 – ratsimihah

相關問題