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

相关问题