2012-04-13 2 views
1

목표 C 및 단위 테스트가 처음인데도 불구하고 프로젝트에서 약간의 TDD를 수행하고 싶었습니다. json 응답을 반환하는 웹 서비스에 연결하는 프로젝트를 만들었습니다. 이제는 웹 서비스를 조롱하기 위해 단위 테스트를 만들었고 실패해도 계속 실패하고 있습니다 ....조롱 된 웹 서비스를 이용한 단위 테스트는 계속 충돌합니다.

다음 설정이 있습니다.

SignUpService (새 계정 만들기) ServiceHelper (실제 http 웹 서비스 요청을하는)을 사용합니다.

@implementation SignUpServiceTests 

@synthesize signUpService; 
@synthesize createUserAccountRequest; 
@synthesize serviceHelper; 

- (void)setUp { 
    [super setUp]; 

    // Set-up code here. 
    self.createUserAccountRequest = [[CreateUserAccountRequest alloc] init]; 
    self.createUserAccountRequest.firstName = @"first-name"; 
    self.createUserAccountRequest.lastName = @"last-name"; 
    ..... 

    self.serviceHelper = [ServiceHelper new]; 

    self.signUpService = [[SignUpService alloc] initWithHelper:(id <ServiceHelperProtocol>) self.serviceHelper]; 
} 

- (void)tearDown { 
    // Tear-down code here. 
    [super tearDown]; 
} 

- (void)testOnCreateUserAccountShouldReturnCreatedUserIdWhenCorrectResponseFromService { 
    id mock = [OCMockObject partialMockForObject:(NSObject *) (id <ServiceHelperProtocol>) self.serviceHelper]; 
    [[[mock stub] andReturn:@"{\"status\":\"ok\",\"create_user\":\"12\"}"] get:[OCMArg any]]; 

    assertThat([self.signUpService createUserAccount:self.createUserAccountRequest], equalTo(@"12")); 
} 
,369,136 :

@protocol ServiceHelperProtocol <NSObject> 
@required 
- (NSString *)get:(NSString *)url; 
@end 

@interface ServiceHelper : NSObject <ServiceHelperProtocol> { 
    NSMutableData *receivedData; 
} 

그리고 SignUpService.h

@class ServiceHelper; 

@protocol SignUpServiceProtocol <NSObject> 
- (NSString *)createUserAccount:(CreateUserAccountRequest *)createUserAccountRequest; 
- (bool)doesUsernameExist:(NSString *)userName; 
- (BOOL)isEmailValid:(NSString *)email; 
- (BOOL)doesEmailExist:(NSString *)email; 
@end 

@interface SignUpService : NSObject <SignUpServiceProtocol> { 
    id <ServiceHelperProtocol> serviceHelper; 
} 

@property(strong) id <ServiceHelperProtocol> serviceHelper; 
- (id)initWithHelper:(id <ServiceHelperProtocol>)myServiceHelper; 

다음 단위 테스트 (SignUpServiceTests.h 및 실행)

@interface SignUpServiceTests : SenTestCase { 
    id <NSObject, ServiceHelperProtocol> serviceHelper; 

    SignUpService *signUpService; 
    CreateUserAccountRequest *createUserAccountRequest; 
} 
@property(nonatomic, strong) SignUpService *signUpService; 
@property(nonatomic, strong) CreateUserAccountRequest *createUserAccountRequest; 
@property(nonatomic, strong) id <NSObject, ServiceHelperProtocol> serviceHelper; 

및 구현은 : ServiceHelper.h 이처럼3210

프로젝트에는 OCMock 버전 1.77 및 OCHamcrest 라이브러리가 포함되어 있습니다.

"프로세스가 종료 코드 0으로 완료되었습니다."라는 이유로 테스트가 계속 충돌합니다. 내가 디버깅 할 때 나는 무엇이 잘못되었는지 알 수 없다. 메모리 관리와 관련이 있거나 OCMock 및 ARC와 관련이 있다고 생각합니까? (like herehere)

새내기 Objective C 개발자를위한 생각이나 제안이 있으십니까?

답변

0

추가 정보가 없어도 메모리 문제로 인한 것이 아니라 옥텟이 시작될 때 로더가 OCMock 프레임 워크를 찾을 수 없기 때문에 의심 스럽습니다. OS X에서 링커 (빌드 타임) 시간은 로더 (런타임)와는 다른 방법으로 프레임 워크를 찾습니다.

OCMock의 공개 릴리스는 로더 경로에서 @rpath로 빌드됩니다. 이렇게하면 런타임에 프로젝트 레이아웃을 상당히 유연하게 적용 할 수 있지만 처음에는 혼란 스러울 수 있습니다. 첫 번째 단계로, LC_RPATH 환경 변수를 설정하여 OCMock 프레임 워크를 사용할 수있는 디렉토리를 포함시킬 수 있습니까? drld 맨 페이지의 @rpath에 대한 논의가 더 자세하게 나와 있습니다.

그런데 OCMock 2.0이 최근에 출시되었습니다.

+0

안녕하세요, Erik, 의견을 보내 주셔서 감사합니다. 나는이 컴파일러/환경 설정에 대해별로 신경 쓰지 않는다. Xcode에 이러한 변수 나 @rpath를 넣어야하는 곳에서 나를 도울 수 있습니까? –