ios - OCMock 仅针对后代类的部分模拟

标签 ios objective-c unit-testing ocmock

我正在尝试在我们的大型项目中设置一些单元测试。问题是某些 ViewController 在调用部分模拟崩溃时会出现以下跟踪:

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,否则我将无法检查它的方法,但是必须完全模拟它的父类(super class)(和方法)以防止这些崩溃。我们将不胜感激。

最佳答案

很抱歉这么晚才回复我自己的问题。事实证明问题非常简单。我通过以下方式模拟 ViewController:

id mock = OCMPartialMock([MyViewController new]);

这当然是错误的,并且崩溃日志是正确的,我的 View 导出未设置(因为我没有真正加载我的 xib 文件)。所以我所要做的就是使用指定的初始化程序创建 VC(因此加载它的 xib):

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

关于ios - OCMock 仅针对后代类的部分模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28238455/

相关文章:

objective-c - 关于iOS5 SDK中自动引用计数的一些问题

iphone - 使用 CFDictionaryCreate 和特殊字符创建 CFDictionaryRef

java - tearDown (@After) 方法断言错误吗?

objective-c - IOS菜单/设计

ios - 将计时器设置为 UIPageViewController

ios - Swift 中的左对齐垂直 UILabel

ios - 更改 UIWebview 框架会更改 iOS9 中的 ScrollView

使用枚举的 iPhone switch 语句

java - 使用 Mockito 进行 Android 仪器测试

android - 如何对特定的 JUnit 测试用例执行 @After?