OCMock抛出EXC_BAD_ACCESS

时间:2016-06-16 16:05:01

标签: ios objective-c unit-testing ocmock

我刚刚下载了OCMock,用于测试我正在处理的库。我试图在第一个存根中遇到问题。我有一个处理所有网络操作的对象,我有另一个对象,它有一个绘制接收信息的地图。我想模拟网络对象来测试地图对象。

这是我的测试文件:

@interface STMap ()

@property (retain) STNetwork* router;

@end

@interface testSTMap : XCTestCase <STMapDelegate>

@property (retain) MKMapView* mapView;
@property (retain) STMap* testMap;
@property (retain) id mockRouter;

@end

@implementation testSTMap

- (void)setUp {
    [super setUp];
    // Put setup code here. This method is called before the invocation of each test method in the class.
    self.mapView = [[MKMapView alloc] init];
    self.testMap = [[STMap alloc] initWithDelegate:self andKey:@"test" andRouteOptions:nil
                                            andMap:self.mapView andOverlayLevel:MKOverlayLevelAboveLabels];
    self.mockRouter = OCMClassMock([STNetwork class]);
    self.testMap.router = self.mockRouter;
}

- (void)testExample {
    // This is an example of a functional test case.
    // Use XCTAssert and related functions to verify your tests produce the correct results.
    OCMStub([self.mockRouter getRouteForStartLat:[OCMArg any] andStartLon:[OCMArg any]
                                       andEndLat:[OCMArg any] andEndLon:[OCMArg any]])._andReturn(nil);
    [self.testMap addRouteForStartLat:@0 andStartLon:@0 andEndLat:@1 andEndLon:@1];
}

如您所见,我保留了所有3个属性,因此错误并非来自测试本身。我的地图对象具有私有属性,包括网络对象,这就是为什么我在测试中创建了一个扩展,以便能够将其更改为模拟对象。此时,我甚至还没有调用地图对象,所以我不会发布它的代码。

网络对象如下所示(所有属性都是私有的):

@interface STNetwork ()

@property (retain) NSString* url;
@property (weak) id<STNetworkDelegate> delegate;
@property (retain) NSString* key;
@property (copy) CompletionBlock completionHandler;

@end

我知道委托属性必须是弱的以避免保留周期,所以我怀疑这是导致错误。

错误将在OCMStub的行中抛出。跟踪:

  • OCMStubRecorder.m - 第112行: if(OCMIsObjectType([aValue objCType]))。此时,aValue为零,这就是问题的起点,但我不知道aValue的来源。
  • OCMFunctions.m第78行: const char * unqualifiedObjCType = OCMTypeWithoutQualifiers(objCType); 。在这里,objCType为NULL,正如预期的那样aValue为零。
  • OCMFunctions.m第40行: while(strchr(&#34; rnNoORV&#34;,objCType [0])!= NULL)。这是实际发生错误访问的地方。

我尝试的事情:

  • 将[OCMArg any]更改为硬编码值
  • 从模拟
  • 返回一个数字,NSNull和void

这些都没有让我超越了糟糕的访问权限。非常感谢任何帮助!

- (void)getRouteForStartLat: (NSNumber*) startLat
                andStartLon: (NSNumber*) startLon
                  andEndLat: (NSNumber*) endLat
                  andEndLon: (NSNumber*) endLon;

1 个答案:

答案 0 :(得分:2)

您是否尝试过使用andReturn()?带有下划线前缀的版本仅供内部使用。