2012-06-21 2 views
0

이 될 경우, json을 파싱하여 기본 문자열 토큰이나 에러 메시지를 반환합니다. 나는 - 단지 내가 콜백을 수정하지 않는 한 - 그것은 아래의 두 콜백을 호출하는 것처럼 것을 발견하기 위해 실제 엔드 포인트에 이것을 유선까지이NSString 타입의 프로퍼티가 [NSNull null]

- (void)testVerifyCallbackInvokesErrorCallbackOnDelegateWhenParserReturnsError 
{ 
    SomeResult *result = [[SomeResult alloc] init]; 
    result.error = @"fail"; 
    [[self.delegate expect] callBackWithError:@"fail"]; 
    [[self.delegate reject] callBackWithToken:OCMArg.any]; 
    [[[self.parser stub] andReturn:result] parseVerifyHttpResponseAndReturnResult:nil]; 
    [self.sut callBackWithVerifyHttpResponse:nil]; 
    [self.delegate verify]; 
} 

- (void)testVerifyCallbackInvokesTokenCallbackOnDelegateWhenParserReturnsToken 
{ 
    SomeResult *result = [[SomeResult alloc] init]; 
    result.token = @"token"; 
    [[self.delegate expect] callBackWithToken:@"token"]; 
    [[self.delegate reject] callBackWithError:OCMArg.any]; 
    [[[self.parser stub] andReturn:result] parseVerifyHttpResponseAndReturnResult:nil]; 
    [self.sut callBackWithVerifyHttpResponse:nil]; 
    [self.delegate verify]; 
} 

모든 증명

- (void)callBackWithVerifyHttpResponse:(NSData *)response 
{ 
    SomeResult *result = [self.parser parseVerifyHttpResponseAndReturnResult:response]; 
    if (result.token) { [self.delegate callBackWithToken:result.token]; } 
    if (result.error) { [self.delegate callBackWithError:result.error]; } 
} 

시험은 잘했다 (내가 바라던하지 무엇을)

- (void)callBackWithVerifyHttpResponse:(NSData *)response 
{ 
    SomeResult *result = [self.parser parseVerifyHttpResponseAndReturnResult:response]; 
    if (result.token != [NSNull null]) { [self.delegate callBackWithToken:result.token]; } 
    if (result.error != [NSNull null]) { [self.delegate callBackWithError:result.error]; } 
} 

그래서이 부분 질문

  1. 왜 이것을 증명할 수있는 시험을 작성할 수 없습니까? 오류 또는 토큰을 NULL 또는 NSNull로 설정하면 언제든지 정상적으로 작동합니다.

  2. != [NSNull null]을 입력하면 생산 코드가 조건을 충족하지 못하는 이유는 무엇입니까 (아직 ' t 내가 값을 NSLog 때 시뮬레이터에서 실행하는 동안 <null>을 제외한 아무것도 얻을 수가?

을 명심 토큰/오류 속성은 SomeResult 객체

@interface SomeResult : NSObject 

@property (strong, nonatomic) NSString *token; 
@property (strong, nonatomic) NSString *error; 

@end 

답변

2

에 다음과 같이 귀하의 원래 코드 d 테스트에서 토큰 또는 오류 중 하나가 nil이 아닌 [NSNull null]이 아닌 것으로 예상됩니다. 아마도 프로덕션 엔드 포인트에 대해 실행할 때 파서는 [NSNull null] 값을 설정합니다.

이 테스트는 수정 된 코드를 통과해야합니다

- (void)testVerifyCallbackInvokesErrorCallbackOnDelegateWhenParserReturnsError 
{ 
    SomeResult *result = [[SomeResult alloc] init]; 
    result.error = @"fail"; 
    result.token = [NSNull null]; 
    [[self.delegate expect] callBackWithError:@"fail"]; 
    [[self.delegate reject] callBackWithToken:OCMArg.any]; 
    [[[self.parser stub] andReturn:result] parseVerifyHttpResponseAndReturnResult:nil]; 
    [self.sut callBackWithVerifyHttpResponse:nil]; 
    [self.delegate verify]; 
} 

- (void)testVerifyCallbackInvokesTokenCallbackOnDelegateWhenParserReturnsToken 
{ 
    SomeResult *result = [[SomeResult alloc] init]; 
    result.token = @"token"; 
    result.error = [NSNull null]; 
    [[self.delegate expect] callBackWithToken:@"token"]; 
    [[self.delegate reject] callBackWithError:OCMArg.any]; 
    [[[self.parser stub] andReturn:result] parseVerifyHttpResponseAndReturnResult:nil]; 
    [self.sut callBackWithVerifyHttpResponse:nil]; 
    [self.delegate verify]; 
} 

당신은 웹 서비스 및/또는 미묘하게 그 동작을 변경할 수있는 타사 파서 상대하고, 그것을 방어 코딩하는 것이 좋다. 당신이 처리 할 수있는 모두 nilNSNull :

- (void)callBackWithVerifyHttpResponse:(NSData *)response 
{ 
    SomeResult *result = [self.parser parseVerifyHttpResponseAndReturnResult:response]; 
    if (result.token && result.token != [NSNull null]) { [self.delegate callBackWithToken:result.token]; } 
    if (result.error && result.error != [NSNull null]) { [self.delegate callBackWithError:result.error]; } 
} 

또한/다른 경우이을 할 수 있습니다 -이 오류, 또는 오류를 무시하는 경우 중 첫 번째 오류에 대한 테스트 및 결코 토큰을 설정하면 경우 토큰을 얻으십시오. 두 콜백을 모두 호출하지 않으려면 코드 경로에서 불가능하게 만듭니다.

+0

언제나처럼 ~! –