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

Posted

技术标签:

【中文标题】添加根视图控制器 OCMockObject[UIViewController] 作为子视图控制器错误【英文标题】:Adding a root view controller OCMockObject[UIViewController] as a child view controller error 【发布时间】:2013-07-29 15:09:42 【问题描述】:

我一直在为 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 框架上做错了什么,但真的是为什么我一直收到这个错误。

【问题讨论】:

粘贴实际的回溯可能会有所帮助。 你应该嘲笑 self.app dayNightTrigger 吗? 【参考方案1】:

我遇到了同样的问题。我猜你的属性 bottomMenu、topMenu 和 mainScreen 将底部、顶部和主设置为另一个视图控制器的子视图控制器。

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

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

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

@end

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

【讨论】:

以上是关于添加根视图控制器 OCMockObject[UIViewController] 作为子视图控制器错误的主要内容,如果未能解决你的问题,请参考以下文章

在Mac应用程序中添加自定义视图控制器作为根视图控制器?

导航栏上的 iOS::Button 仅出现在根视图控制器上

根视图控制器的确切含义

iOS 编程:关于根视图控制器的说明

UIViewController 根视图中的 UITableView 显示

在根视图控制器上管理视图控制器,如 iPad 中的子视图