2013-07-29 47 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 

这意味着它不会在视图控制器添加到它的孩子名单。

相关问题