2012-06-25 1 views
4

통과하는 블록이 올바르게 실행되는지 어떻게 확인할 수 있습니까?통과하는 블록을 테스트하는 OCMock이 올바르게 실행됩니다.

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    [self updatePostalCode:newLocation withHandler:^(NSArray *placemarks, NSError *error) { 
    // code that want to test 
     CLPlacemark *placemark = [placemarks objectAtIndex:0]; 
     self.postalCode = [placemark postalCode]; 
     _geocodePending = NO; 
    }]; 

    .... 
} 

난을 PostalCode이 _geocodePending이 올바르게 설정되어 있는지 알고 싶어,하지만 난 OCMock 함께이 작업을 수행하는 방법을 알아낼 수 없습니다.

추가 코드

id mockSelf = [OCMockObject partialMockForObject:_location]; 

    id mockPlacemart = (id)[OCMockObject mockForClass:[CLPlacemark class]]; 

    [[[mockPlacemart stub] andReturn:@"10170"] postalCode]; 

    [mockSelf setGeocodePending:YES]; 
    [mockSelf setPostalCode:@"00000"]; 

    [self.location handleLocationUpdate]([NSArray arrayWithObject:mockPlacemart], nil); 

    STAssertFalse([mockSelf geocodePending], @"geocodePending should be FALSE"); 
    STAssertTrue([[mockSelf postalCode] isEqualToString:@"10170"], @"10170", @"postal is expected to be 10170 but was %@" , [mockSelf postalCode]); 

답변

6
클래스의 메소드에서 핸들러 블록을 반환

. 시험 가능성을 포함하여 There are a few good reasons to do this

- (void (^)(NSArray *, NSError *))handleLocationUpdate { 
    __weak Foo *weakself = self; 
    return ^(NSArray *placemarks, NSError *error) { 
     CLPlacemark *placemark = [placemarks objectAtIndex:0]; 
     weakself.postalCode = [placemark postalCode]; 
     weakself.geocodePending = NO; 
    } 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    [self updatePostalCode:newLocation withHandler:[self handleLocationUpdate]]; 

    .... 
} 

그런 다음 테스트 : 완벽하게 작동하고 문서 지혜가 그것을 비하인드,하지만 난 이해가 안 설명

-(void)testLocationUpdates { 
    id mockPlacemark = [OCMockObject mockForClass:[CLPlacemark class]]; 
    [[[mockPlacemark stub] andReturn:@"99999"] postalCode]; 

    myClass.geocodePending = YES; 
    myClass.postalCode = @"00000"; 

    [myClass handleLocationUpdate]([NSArray arrayWithObject:mockPlacemark], nil); 

    expect(myClass.geocodePending).toBeFalsy; 
    expect(myClass.postalCode).toEqual(@"99999"); 
} 
+0

감사합니다'[myClass가 handleLocationUpdate] ([NSArray를 arrayWithObject : mockPlacemark] 무); '그리고'expect(). to ... ... '을 볼 수 없습니까? 그리고 내 코드를 질문에 넣으면 이해할 수 있습니까? – sarunw

+0

나열된대로 메소드를 정의하면'[myClass handleLocationUpdate]'는 블록을 리턴합니다. 블록을 함수로 실행하고 귀하의 모의가 포함 된 위치 표시 배열을 전달 중입니다. –

+0

'expect()'는 Pete Kim의 우수한 matcher 프레임 워크 인 [Expecta] (https://github.com/petejkim/expecta)에서 가져온 것입니다. 우리는 모든 프로젝트에서이를 사용합니다. –

관련 문제