2017-02-28 7 views
0

2ブロックのメソッドを持つクラス(AFHTTPSessionManager)を模擬しようとしていますが、どのように手動でトリガできますか?2つのテストでは最初のブロック実装を使用しますもう1つのテストは2番目のブロック実装を使用します。2ブロック完了のOCMockスタブメソッド

[manager GET:path parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) { 
    //First block to trigger. 
    //logic code here 
} failure:^(NSURLSessionDataTask *task, NSError *error) { 
    //Second block to trigger. 
    //logic code here 
}]; 

現在のところ、常に2番目のブロックがトリガーされます。

私はこのようなクラスを嘲笑しました:

NSError *error = [NSError errorWithDomain:NSLocalizedFailureReasonErrorKey code:-1009 userInfo:nil]; 
NSDictionary *responseObject = [NSDictionary dictionaryWithObjectsAndKeys:@"object", @"key", nil]; 

id mockAFHTTPSessionManager = OCMClassMock([AFHTTPSessionManager class]); 

OCMStub([mockAFHTTPSessionManager alloc]).andReturn(mockAFHTTPSessionManager); 
OCMStub([mockAFHTTPSessionManager initWithBaseURL:OCMOCK_ANY]).andReturn(mockAFHTTPSessionManager); 
OCMStub([mockAFHTTPSessionManager GET:OCMOCK_ANY parameters:OCMOCK_ANY success:([OCMArg invokeBlockWithArgs:OCMOCK_ANY, responseObject, nil]) failure:([OCMArg invokeBlockWithArgs:OCMOCK_ANY, error, nil])]); 

答えて

0

あなたはアロケーション/ initWithBaseURLをスタブしている具体的な理由があるのならば、私は知らないが、ここではどのようにIモックAFHTTPSessionManagerです:

は、
id mockSessionManager = OCMClassMock([AFHTTPSessionManager class]); 
OCMStub([mockSessionManager manager]).andReturn(mockSessionManager); 

成功/失敗ブロックの呼び出しをテストするために、私は頭痛の束を救った提案をします:あなたのブロックをインライン化しないでください。その代わりに、ブロックを別のメソッドから戻し、それらのメソッドを個別にテストしてください。次に、実際のGET:parameters:success:failure呼び出しをテストしているテストでは、完了ブロックを返すメソッドが呼び出されることを期待するだけです。

ここでは例です:

MyClass.m

- (void)doGetRequest 
{ 
    AFHTTPSessionManager* manager = [AFHTTPSessionManager manager]; 
    [manager GET:@"http://something.whatever.com" 
      parameters:nil 
       success:[self getSuccessBlock] 
       failure:[self getFailureBlock]]; 
} 

- (void (^)(NSURLSessionDataTask*, id))getSuccessBlock 
{ 
    return ^(NSURLSessionDataTask* task, id responseObject) 
     { 
      // handle success 
     }; 
} 

- (void (^)(NSURLSessionDataTask*, NSError*))getFailure 
{ 
    return ^(NSURLSessionDataTask* task, NSError* error) 
     { 
      // handle failure 
     } 
} 

MyClassTests.m

- (void)testDoGetRequest 
{ 
    MyClass* myClass = [[MyClass alloc] init]; 
    id mockMyClass = OCMPartialMock(myClass); 
    id mockSessionManager = OCMClassMock([AFHTTPSessionManager class]); 
    OCMStub([mockSessionManager manager]).andReturn(mockSessionManager); 

    id successBlock = ^(NSURLSessionDataTask* task, id o){}; 
    id failureBlock = ^(NSURLSessionDataTask* task, NSError* error){}; 
    OCMExpect([mockMyClass getSuccess]).andReturn(successBlock); 
    OCMExpect([mockMyClass getFailure]).andReturn(failureBlock); 

    OCMExpect([mockSessionManager GET:OCMOCK_ANY 
          parameters:OCMOCK_ANY 
           success:successBlock 
           failure:failureBlock]); 

    [myClass doGetRequest]; 

    OCMVerifyAll(mockMyClass); 
    OCMVerifyAll(mockSessionManager); 
} 

- (void)testGetSuccessBlock 
{ 
    MyClass* myClass = [[MyClass alloc] init]; 
    // setup expectations 
    NSURLSessionDataTaks* fakeTask = // whatever you need here 
    id fakeResponseObject = // whatever you need here 
    [myClass getSuccessBlock](fakeTask, fakeResponseObject); 
    // evaluate expectations 
} 

- (void)testGetFailureBlock 
{ 
    MyClass* myClass = [[MyClass alloc] init]; 
    // setup expectations 
    NSURLSessionDataTaks* fakeTask = // whatever you need here 
    NSError* fakeError = // whatever you need here 
    [myClass getFailureBlock](fakeTask, fakeError); 
    // evaluate expectations 
} 

(私は基本的に私の頭の上からこれを書いたので、いくつかのの構文は100%ではないかもしれませんが、あなたはその考えを得るべきです)

関連する問題