OCMock Partial mock仅适用于后代类

时间:2015-01-30 14:52:29

标签: ios objective-c unit-testing ocmock

我正在尝试在我们庞大的项目中设置一些单元测试。问题是一些ViewControllers在调用部分模拟崩溃时跟踪了跟踪:

error: -[EspionageViewControllerTests testFillEspionageTabInfo] : failed: caught "NSInternalInconsistencyException", "-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "EspionageViewController" nib but the view outlet was not set."
    0   CoreFoundation                      0x0000000111264f35 __exceptionPreprocess + 165
        1   libobjc.A.dylib                     0x0000000110efdbb7 objc_exception_throw + 45
        2   CoreFoundation                      0x0000000111264e6d +[NSException raise:format:] + 205
        3   UIKit                               0x000000010f68805f -[UIViewController _loadViewFromNibNamed:bundle:] + 441
        4   UIKit                               0x000000010f688588 -[UIViewController loadView] + 109
        5   UIKit                               0x000000010f6887f9 -[UIViewController loadViewIfRequired] + 75
        6   UIKit                               0x000000010f688c8e -[UIViewController view] + 27
        7   AppName                   0x000000010c07c388 -[IOViewController setTopBarView:] + 1144

据我所知,我遇到了setTopBarView的问题,特别是我做了以下的地方:

[viewElement setFrame:CGRectMake(viewElement.frame.origin.x, self.view.bounds.origin.y - viewElement.frame.size.height , viewElement.frame.size.width, viewElement.frame.size.height)];

所以self.view调用会导致崩溃。我的问题是如何避免这种情况 - 特别是当我的EspionageViewController是定义了setTopBarView的另一个ViewController的子类时。我需要在EspionageVC上使用OCMPartialMock,否则我将无法检查它的方法,但是它的超类(和方法)必须完全模拟以防止这些崩溃。任何帮助都会被贬低。

1 个答案:

答案 0 :(得分:1)

很抱歉我回答了自己的问题。事实证明这个问题非常简单。我用以下方式嘲笑ViewController:

id mock = OCMPartialMock([MyViewController new]);

当然是错误的,崩溃日志是正确的,我的视图插座没有设置(因为我没有真正加载我的xib文件)。所以我所要做的就是使用指定的初始值创建VC(因此加载它的xib):

id mock = OCMPartialMock([[MyViewController alloc] initWithNibName:NSStringFromSelector([MyViewController class]) bundle:nil]);