Ios 用于子视图控制器时,OCMock抛出EXEC\u BAD\u访问权限
我有一个包含以下代码的测试用例:Ios 用于子视图控制器时,OCMock抛出EXEC\u BAD\u访问权限,ios,exc-bad-access,ocmock,xctest,Ios,Exc Bad Access,Ocmock,Xctest,我有一个包含以下代码的测试用例: #import <XCTest/XCTest.h> #import <OCMock/OCMock.h> @interface ChildViewControllerTests : XCTestCase @end @implementation ChildViewControllerTests -(void) testInitAddsPassedControllersAsChildViews { id mockTVC1 = [
#import <XCTest/XCTest.h>
#import <OCMock/OCMock.h>
@interface ChildViewControllerTests : XCTestCase
@end
@implementation ChildViewControllerTests
-(void) testInitAddsPassedControllersAsChildViews {
id mockTVC1 = [OCMockObject niceMockForClass:[UITableViewController class]];
id mockTVC2 = [OCMockObject niceMockForClass:[UITableViewController class]];
UIViewController *controller = [[UIViewController alloc] init];
[controller addChildViewController:mockTVC2]; // Fails if mockTVC2, but mockTVC1 works.
}
@end
#导入
#进口
@接口ChildViewControllerTests:xTestCase
@结束
@实现ChildViewControllerTests
-(无效)TestInitAddSpassedControllersAsChildView{
id mockTVC1=[OCMockObject niceMockForClass:[UITableViewController类]];
id mockTVC2=[OCMockObject niceMockForClass:[UITableViewController类]];
UIViewController*控制器=[[UIViewController alloc]init];
[controller addChildViewController:mockTVC2];//如果mockTVC2失败,但mockTVC1工作。
}
@结束
这是我能做到的最简单的事情。当我运行这个测试时,我得到一个EXEC_BAD_访问解除分配mockTVC2
如果我将mockTVC1添加到控制器中,它就可以正常工作
如果我交换mockTVC1和mockTVC2声明的顺序,它就可以正常工作
如果我交换mockTVC1和mockTVC2声明的顺序,并更改为添加mockTVC1,它将再次失败
因此,我的总结是,问题与第二个mock的声明有关,因为无论我如何排序声明,如果我尝试将声明的第二个mock添加到控制器中,则在取消分配时失败
你们中的一些人能做一个快速剪切粘贴,看看你们是否也能做到这一点
我想确认这不仅仅是我的设置
谢谢我已经在我的机器上尝试了你的代码,但似乎在mockTVC1和mockTVC2(iOS 7模拟器)上都随机失败了。。。我最好尝试使用真正的表视图控制器(如果可以的话)。我有时会这样做,而不是模仿UITextField等UIKit类。感谢您的检查。我使用mock是因为我想检查客户控制器的功能。原始代码使用的是扩展UIViewController类的模拟。正如您所说,上面的示例最好使用真实的UIViewController,但我对使用OCMock时可能出现的问题感兴趣。您想测试什么?您可以通过使用部分模拟来实现这一点。