OCUnit使用UINavigationController和UITableView测试我的应用程序

Pok*_*com 2 iphone objective-c ocunit uitableview uinavigationcontroller

我想编写集成应用程序测试来测试完整的CRUD操作.我有一个表视图列出所有对象.用户可以单击"添加"按钮推送新的详细视图控制器以添加新对象; 他们可以单击现有对象来推送详细视图控制器以重命名对象; 他们还可以从列表中删除对象.

我很高兴尝试使用OCUnit测试我的应用程序.但是,我遇到了一些奇怪的错误.我正在使用UITabBarController + UINavigationController.我的UINavigationController中有超过3级的pushViewController.如果我使用[self.navigationController pushViewController:viewController animated:YES]测试代码,它主要使用两个警告:

nested push animation can result in corrupted navigation bar
nested pop animation can result in corrupted navigation bar
Run Code Online (Sandbox Code Playgroud)

我注意到没有调用viewDidAppear因此警告.

然后我尝试通过更改动画来解决方法:是动画:否.警告消失了.但是,我遇到了另一个根本没有调用viewDidLoad的bug.因此视图不会从NIB文件加载,并且所有IB控件都是零.如果我将动画设置为YES,则不是这种情况.

这是我用来获取UINavigationController中根视图控制器句柄的代码.

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

我在测试中手动调用此代码来模拟UITableView上的单击:

[rootVC tableView:rootVC.tableView didSelectRowAtIndexPath:ip];  // push is called inside this
Run Code Online (Sandbox Code Playgroud)

所以我被卡住了我设置动画:是或动画:不.有没有人成功使用OCUnit来测试UINavigationController + UITableView的应用程序?如果是这样,请您分享一些示例代码或您的经验?

Jon*_*eid 7

首先,对于单元测试,不要从应用程序委托中获取根视图控制器.实际的根视图控制器是单例,单元测试中的单例创建测试间依赖关系.相反,让测试设置(并拆除)自己的视图控制器实例.

某些类型的测试需要视图控制器加载其nib - 例如,创建表视图.对于这些测试,请致电

[rootVC view];
Run Code Online (Sandbox Code Playgroud)

要测试是否按下了视图控制器,请使用实际视图控制器的测试子类并重写navigationController以返回可以验证的模拟对象.例如,

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

@implementation TestingMyViewController

@synthesize mockNavigationController;

- (UINavigationController *)navigationController
{
    return mockNavigationController;
}

@end
Run Code Online (Sandbox Code Playgroud)

然后让你的测试创建一个TestingMyViewController和一个模拟.设置模拟,并将其分配给测试子类.调用要测试的方法,然后使用您期望的参数验证模拟导航控制器是否收到了您期望的调用.