2013-07-29 41 views
0

我一直在研究iOS編程的單元測試,並且在嘗試通過嘲弄它來驗證我的主類時遇到了一些小問題子類使用OCMock,然後查看主類是否添加子控制器(mockObjects [uiviewContoller]),然後驗證對象是否在每個子控制器上調用方法。添加一個根視圖控制器OCMockObject [UIViewController]作爲子視圖控制器錯誤

的問題是我不斷收到一個「測試失敗‘並稱一個根視圖控制器OCMockObject [UIViewController中作爲視圖控制器的孩子’」

每個其他時間我運行測試。

- (void)setUp 
{ 
    [super setUp]; 
    testMain = [[UIViewController alloc] init]; 
} 

- (void)tearDown 
{ 
    for (UIViewController *testCon in testMain.childViewControllers) { 
     [testCon removeFromParentViewController]; 
    } 
    testMain = nil; 
    [super tearDown]; 
} 

測試:

- (void) testDayNightTriggerTriggersAllSubviews{ 
    id mockTopController = [OCMockObject niceMockForClass:[UIViewController class]]; 
    id mockBottomController = [OCMockObject niceMockForClass:[UIViewController class]]; 
    id mockMainScreen = [OCMockObject niceMockForClass:[UIViewController class]]; 

    [[mockTopController expect] dayNightTrigger]; 
    [[mockBottomController expect] dayNightTrigger]; 
    [[mockMainScreen expect] dayNightTrigger]; 

    //trigger 

    [testMain dayNightTrigger:mockTopController bottom:mockBottomController main:mockMainScreen]; 

    [mockBottomController verify]; 
    [mockTopController verify]; 
    [mockMainScreen verify]; 

} 

方法來驗證:

//overload 
- (void) dayNightTrigger:(UIViewController *) top bottom:(UIViewController *)bottom main:(UIViewController *)main{ 
    self.bottomMenu = bottom; 
    self.topMenu = top; 
    self.mainScreen = main; 
    [self dayNightTrigger]; 
} 
- (void) dayNightTrigger{ 
    [self.app dayNightTrigger]; 

    [self.bottomMenu dayNightTrigger]; 
    [self.topMenu dayNightTrigger]; 
    [self.mainScreen dayNightTrigger]; 
} 

我在想,如果有什麼毛病我安裝/拆卸?或者我在做錯誤的OCMock框架,但真的爲什麼我不斷收到這個錯誤。

+0

粘貼實際的回溯可能會有幫助。 –

+0

你應該嘲笑self.app dayNightTrigger嗎? –

回答

3

我遇到了同樣的問題。我猜你的屬性bottomMenu,topMenu和mainScreen將bottom,top和main設置爲另一個視圖控制器的子視圖控制器。

不幸的是,addChildViewController:查看UIViewController *結構中的某個值。由於它是直接內存訪問而不是方法調用,所以OCMockObject不能攔截它。結果,模擬對象(有時)被視爲根視圖。

,我發現周圍的方法是重寫addChildViewController:我在測試文件測試,並將它什麼也不做的對象:

@implementation MyViewController (overwriteForTesting) 
- (void)addChildViewController:(UIViewController *)childController { 
} 
@end 

這意味着它不會在視圖控制器添加到它的孩子名單。

相關問題