Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 使用UINavigationController和UITableView测试我的应用程序_Iphone_Objective C_Uitableview_Uinavigationcontroller_Ocunit - Fatal编程技术网

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

Iphone 使用UINavigationController和UITableView测试我的应用程序,iphone,objective-c,uitableview,uinavigationcontroller,ocunit,Iphone,Objective C,Uitableview,Uinavigationcontroller,Ocunit,我想编写集成应用程序测试来测试完整的CRUD操作。我有一个表视图来列出所有对象。用户可以点击“添加”按钮,按下一个新的局部视图控制器,添加一个新的对象;他们可以单击现有对象以推送局部视图控制器以重命名该对象;他们还可以从列表中删除对象 我很兴奋能试用OCUnit来测试我的应用程序。然而,我遇到了一些奇怪的错误。我正在使用UITabBarController+UINavigationController。我的UINavigationController中有3个以上级别的pushViewContro

我想编写集成应用程序测试来测试完整的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
我注意到viewDidAppear没有被调用,因此出现了警告

然后,我尝试通过将动画:是更改为动画:否来解决问题。警告消失。然而,我遇到了另一个bug,其中根本没有调用viewDidLoad。因此,视图不会从NIB文件加载,所有IB控件都为零。如果将“动画”设置为“是”,则情况并非如此

这是我用来获取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

因此,我要么设置动画:是,要么设置动画:否。是否有人成功使用OCUnit使用UINavigationController+UITableView测试应用程序?如果是这样的话,您能分享一些示例代码或您的经验吗?

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

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

[rootVC view];
要测试是否推送了视图控制器,请使用实际视图控制器的测试子类,并覆盖
navigationController
以返回可以验证的模拟对象。比如说,

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

@implementation TestingMyViewController

@synthesize mockNavigationController;

- (UINavigationController *)navigationController
{
    return mockNavigationController;
}

@end

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

很难确定要测试的内容—是否推送了特定的视图控制器?感谢提供的提示。对不起,我之前的问题有误导性。我实际上想编写集成应用程序测试。有点像在UIAutomation中编写Javascript来测试端到端。OCUnit能做这项工作吗?还是我最好改用UIAutomation仪器?啊。对于集成测试,我会使用OCUnit或任何其他单元测试框架之外的东西。自动化是一种方法。另一种值得研究的方法是Frank+Cucumber:这样做会使测试通过,但在使用应用程序时,视图控制器不再推送到导航控制器上,即使仍然调用navigationController方法。@LadyPad,此单元测试方法假定已设置有效的navigationController。进行一些调试,看看情况是否如此。谢谢回复。除了在init中初始化模拟导航控制器,我还需要做什么?同时将其声明为“assign”会在初始化期间生成以下警告:privly ios/privly ios/ApplicationTypeViewController.m:20:35:将保留的对象分配给不安全的_未保留的变量;对象将在分配后释放