OCUnit を使用して IOS5 でアプリケーションをテストしています。私の問題を投稿する前に、ここで関連するすべての投稿をできる限り読みました。本当に助かりました。私は現在、以下の問題に直面しています。できるだけ明確に説明しようとしました。
私のアプリケーションには、view controller と言うだけのログイン画面があります: initialController. アプリ デリゲートのルート コントローラーはナビゲーション コントローラーです。ナビゲーション コントローラーのプロパティ initWithRootViewController は、この initialController で設定されます。
ログイン後、アプリケーションは別のコントローラーをロードし、このログインプロセスを実行せずにそのコントローラーで単体テストを実行したいと考えています。
ログイン後、別のコントローラは PostloginController が読み込まれると言い、このコントローラのナビゲーション項目はボタン 1 とボタン 2 の 2 つのボタンでカスタマイズされます。これらのボタンは UIBarButtonItem のサブビューとして追加され、この UIBarButtonItem は PostloginController.navigationItem.rightBarButtonItem.(疑似コード) の rightBarButtonItem として設定されます。
最後に、PostLoginController がナビゲーション コントローラーにプッシュされます。ナビゲーション コントローラー pushviewcontroller:postLoginController.(疑似コード)
ボタン1のUIControlEventTouchUpInsideで別のコントローラーを起動するユニットテストコードを作成する必要があります:Newcontroller. この新しいコントローラーを button1 のイベントにロードすると、1 つのテスト ケースが完了します。
私の問題は、2 つのボタンである UIBarButtonItem のサブビューを取得できないことです。ログは、Navigation Controller に 1 つのコントローラーと 1 つのサブビューしかないことを示しています。私のコードは次のとおりです。
- (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.
}
}
}
}