OCMock 仅针对后代的部分模拟 class
OCMock Partial mock only for descendant class
我正在尝试在我们的大型项目中设置一些单元测试。问题是一些 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 是另一个 ViewController 的 subclass 时,其中定义了 setTopBarView。我需要在 EspionageVC 上使用 OCMPartialMock,否则我将无法检查它的方法,但是它的超级 class(和方法)必须被完全模拟以防止那些崩溃。任何帮助将不胜感激。
抱歉,我的问题回复晚了。问题原来很简单。我用以下方式嘲笑 ViewController:
id mock = OCMPartialMock([MyViewController new]);
这当然是错误的,崩溃日志是正确的,我的视图出口没有设置(因为我没有真正加载我的 xib 文件)。所以我所要做的就是用指定的初始化器创建 VC(因此加载它的 xib):
id mock = OCMPartialMock([[MyViewController alloc] initWithNibName:NSStringFromSelector([MyViewController class]) bundle:nil]);
我正在尝试在我们的大型项目中设置一些单元测试。问题是一些 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 是另一个 ViewController 的 subclass 时,其中定义了 setTopBarView。我需要在 EspionageVC 上使用 OCMPartialMock,否则我将无法检查它的方法,但是它的超级 class(和方法)必须被完全模拟以防止那些崩溃。任何帮助将不胜感激。
抱歉,我的问题回复晚了。问题原来很简单。我用以下方式嘲笑 ViewController:
id mock = OCMPartialMock([MyViewController new]);
这当然是错误的,崩溃日志是正确的,我的视图出口没有设置(因为我没有真正加载我的 xib 文件)。所以我所要做的就是用指定的初始化器创建 VC(因此加载它的 xib):
id mock = OCMPartialMock([[MyViewController alloc] initWithNibName:NSStringFromSelector([MyViewController class]) bundle:nil]);