2016-06-16 8 views
0

私が作業しているライブラリのテストに使用するOCMockをダウンロードしました。私がやろうとした最初のスタブで問題に遭遇しました。私はすべてのネットワーク操作を扱うオブジェクトを持っており、受け取った情報をペイントするマップを持つ別のオブジェクトを持っています。ネットワークオブジェクトをモックしてマップオブジェクトをテストしたい。あなたが見ることができるようにエラーがテスト自体から来ていないので、私はすべての3つの特性を保持OCMock throwing EXC_BAD_ACCESS

@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]; 
} 

は、ここに私のテストファイルです。私のマップオブジェクトは、ネットワークオブジェクトを含むプライベートプロパティを持っているので、これをmockオブジェクトに変更できるようにテストで拡張を作成しました。この時点で、私はマップオブジェクトをまだ呼び出すことさえしていないので、私はそのコードを投稿しません。ネットワークオブジェクトは、この(すべてのプロパティはプライベートです)のように見えます

@interface STNetwork() 

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

@end 

私は、デリゲートのプロパティがサイクルを維持避けるために弱くなければならない知っているので、私は、これはエラーの原因となっている疑い。

OCMStubの行にエラーがスローされます。トレース:

  • OCMStubRecorder.m - ライン112:(OCMIsObjectType([AValueはobjCType]))であれば。この時点で、aValueはnilですが、これが問題の開始場所ですが、aValueの出所はわかりません。
  • OCMFunctions.m行78:const char * unqualifiedObjCType = OCMTypeWithoutQualifiers(objCType);。ここでは、aValueがnilであるため、objCTypeはNULLです。
  • OCMFunctions.m行40:while(strchr( "rnNoORV"、objCType [0])!= NULL)です。ここで悪いアクセスが実際に発生します。

物事は私が試した:

  • を変える[OCMArg任意のハードコードされた値
  • なったこれらのモック

なしから数、nsnullを返却し、無効にします私は悪いアクセスを過ぎた。どんな助けでも大歓迎です!

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

'getRouteForStartLat:andStartLon:andEndLat:andEndLon:'メソッドの宣言を提供できますか? –

+0

@ErikDoernenburgあなたがリクエストした宣言を追加しました – gamda

答えて

2

andReturn()を試しましたか?接頭辞がアンダースコアのバージョンは、内部使用のみのバージョンです。

+0

うわー!修正がとても簡単だとは思えません。なぜ私がアンダースコアを最初に置くのか分からない。 'andReturn(nil)'を実行したときに動作しますが、宣言が 'void'なので' void 'を返したいと思います。しかし、 'andReturn(void)'はコンパイルエラーです。 "変数には型が不完全な 'typeof(void)'と 'Expected expression'があります。 voidを返すことは可能ですか? – gamda

+1

何も返さない場合は、 'andReturn()'をそのままにしておいてください。 –