3

我正在使用 OCUnit 在 IOS5 中测试应用程序。在发布我的问题之前,我尽可能多地阅读了所有相关的帖子。它真的很有帮助。我现在面临以下问题,我试图尽可能清楚地叙述。

  1. 我的应用程序有一个登录屏幕,它只不过是一个视图控制器说:initialController。我的应用程序委托的根控制器是导航控制器。Navigation 控制器的属性 initWithRootViewController 是用这个 initialController 设置的。

  2. 现在登录后,应用程序加载了另一个控制器,我想在该控制器中进行单元测试,而不必经历这个登录过程。

  3. 登录后,另一个控制器说 PostloginController 被加载,这个控制器的导航项是用 2 个按钮自定义的:button1 和 button2。这些按钮被添加为 UIBarButtonItem 的子视图,并且这个 UIBarButtonItem 被设置为 PostloginController.navigationItem.rightBarButtonItem 的 rightBarButtonItem。(伪代码)

  4. 最后 PostLoginController 被推入 Navigation 控制器 navigationcontroller pushviewcontroller:postLoginController.(伪代码)

  5. 我必须编写在 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.
            }
        }
    }
}
4

0 回答 0