我正在使用 OCUnit 在 IOS5 中测试应用程序。在发布我的问题之前,我尽可能多地阅读了所有相关的帖子。它真的很有帮助。我现在面临以下问题,我试图尽可能清楚地叙述。
我的应用程序有一个登录屏幕,它只不过是一个视图控制器说:initialController。我的应用程序委托的根控制器是导航控制器。Navigation 控制器的属性 initWithRootViewController 是用这个 initialController 设置的。
现在登录后,应用程序加载了另一个控制器,我想在该控制器中进行单元测试,而不必经历这个登录过程。
登录后,另一个控制器说 PostloginController 被加载,这个控制器的导航项是用 2 个按钮自定义的:button1 和 button2。这些按钮被添加为 UIBarButtonItem 的子视图,并且这个 UIBarButtonItem 被设置为 PostloginController.navigationItem.rightBarButtonItem 的 rightBarButtonItem。(伪代码)
最后 PostLoginController 被推入 Navigation 控制器 navigationcontroller pushviewcontroller:postLoginController.(伪代码)
我必须编写在 button1 的 UIControlEventTouchUpInside 上的单元测试代码应该启动另一个控制器说:Newcontroller。在 button1 的事件上加载这个新控制器完成了一个测试用例。
我的问题是我没有得到应该是 2 个按钮的 UIBarButtonItem 的子视图。日志显示导航控制器中有一个控制器,只有一个子视图。我的代码如下:
- (void)setUp
{
[super setUp];
// Set-up code here.
self.appDelegate = (MYAppDelegate*)[[UIApplication sharedApplication] delegate ];
self.navigationController = (UINavigationController *)self.appDelegate.window.rootViewController;
}
- (void)testAppDelegate
{
STAssertNotNil(self.appDelegate, @"Cannot find the application delegate");
NSArray *tempArray = [self.navigationController viewControllers];
NSLog(@"Number of controllers in navigationController = %i", [tempArray count]);
}
- (void) testButton1
{
//self.myController = (PostLoginController*)self.navigationController.topViewController;
UIBarButtonItem *barButtonItem = self.navigationController.topViewController.navigationItem.rightBarButtonItem;
UIView *customView = barButtonItem.customView;
NSArray *subviews1 = customView.subviews;
NSLog (@ "Got subviews");
NSLog(@"Number of subviews = %i", [subviews1 count]);
if ([subviews1 count] == 0)
{
NSLog (@ "no subviews");
}
for (UIView* view in subviews1)
{
NSLog(@"%@", view);
if([view isKindOfClass:[UIButton class]])
{
UIButton *btn = (UIButton*)view;
NSLog (@ " UIButton parsed");
// Check if Button1 clicked.
NSData *data1=UIImagePNGRepresentation([btn backgroundImageForState:UIControlStateNormal]);
NSData *data2=UIImagePNGRepresentation([UIImage imageNamed:@"BUTTON1.png"]);
if([data1 isEqualToData:data2]) // CHECKING IF BUTTON1 OR BUTTON2 PRESSED BY IMAGE SINCE THEY DONT HAVE ANY TAGS SET.
{
[btn sendActionsForControlEvents:(UIControlEventTouchUpInside)];
STAssertTrue([self.navigationController.visibleViewController isMemberOfClass: [NewController class]], @" NewController failed to load!"); //BUTTON1 CLICK SHOULD LAUNCH NEWCONTROLLER - COMPLETES ONE TEST CASE.
}
}
}
}