添加根视图控制器OCMockObject [UIViewController]作为子视图控制器错误

时间:2013-07-29 15:09:42

标签: ios uiviewcontroller ocunit ocmock

我一直在为iOS编程进行单元测试,在尝试通过使用OCMock模拟它的子类来验证我的主类时遇到了一个小问题,然后看看主类是否添加了子控制器(mockObjects [uiviewContoller])然后验证对象是否在每个子控制器上调用方法。

问题是我一直在“测试失败”添加根视图控制器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框架做错了,但实际上我为什么一直收到这个错误。

1 个答案:

答案 0 :(得分:3)

我遇到了同样的问题。我猜你的属性bottomMenu,topMenu和mainScreen将bottom,top和main设置为另一个视图控制器的子视图控制器。

不幸的是,addChildViewController:在UIViewController *结构中查看某个值。由于它是直接内存访问而不是方法调用,因此OCMockObject无法拦截它。因此,模拟对象(有时)被视为根视图。

我发现它的方法是覆盖addChildViewController:对我在测试文件中测试的对象并让它什么都不做:

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

这意味着它不会将视图控制器添加到其子列表中。