私が作業しているライブラリのテストに使用する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;
'getRouteForStartLat:andStartLon:andEndLat:andEndLon:'メソッドの宣言を提供できますか? –
@ErikDoernenburgあなたがリクエストした宣言を追加しました – gamda