2013-02-08 2 views
0

메서드의 인수 중 하나에 대해 특정 포인터 값을 사용하여 조롱 된 개체에서 메서드가 호출되는지 확인하려고하지만 계속 "인수 유형 '*'이 지원되지 않습니다." 조롱 된 메서드가 호출 될 때의 예외입니다.char * 인수를 기대하는 OCMock 객체를 설정할 수 있습니까?

uint8_t *buf = calloc(65, sizeof(uint8_t)); 
id stream = [OCMockObject niceMockForClass:[NSInputStream class]]; 
[[stream expect] read:buf maxLength:64]; 
id myStream = [[MyStream alloc] initWithStream:stream]; 
// myStream should pass read:maxLength: call through to stream 
[myStream read:buf maxLength:64]; 
STAssertNoThrow([stream verify], @"Did not pass call through"); 

여기 -[MyStream read:maxLength:]입니다 :

나는 - 읽기 전화
- (NSInteger)read:(uint8_t *)buffer maxLength:maxLength { 
    // internalStream is the stream passed to -initWithStream: 
    return [self.internalStream read:buffer maxLength:maxLength]; 
} 

: 최대 길이 : 여기 내 테스트 코드입니다 ". 인수 유형 '*'지원되지 않습니다"는 조롱 스트림에, 나는 얻을 예외. 특정 포인터 인수 값을 가진 호출을 기대할 수 있습니까?

편집 :이 문제는 * 숯불에 특정 될 수있다처럼

이 보이는 (또는 uint8_t) 인수. Objective C는 그것들을 ''으로 인코딩하고 OCMock의 타입 핸들링 코드는 '^'- 인코딩 된 값만을 포인터로 취급합니다. 나는 해킹을 시도했다 +[OCMArg resolveSpecialValues:]-[NSInvocation getArgumentAtIndexAsObject:] (NSInvocation + OCMAdditions.m)에서 '*'를 '^'와 동일하게 취급한다. 이로 인해 예외가 중지되었지만 기대가 여전히 충족되지 않았습니다.

아무도이 문제를 처리하는 방법을 알고 있습니까? 감사!

답변

0

이 문제점의 해결 방법을 발견했습니다. '*'로 인코딩 된 타입을 처리하기 위해 OCMock을 고치려는 시도는 토끼 구멍으로 가득 찼지만 NimnputStream에서 OCMock이 사용할 수있는 메소드 서명을 반환하는 카테고리를 생성하여 테스트를 수행 할 수있었습니다 :

@interface NSInputStream (OCMockFix) 
    + (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)selector; 
    - (NSMethodSignature *)methodSignatureForSelector:(SEL)selector; 
@end 

@implementation NSInputStream (OCMockFix) 
    + (NSMethodSignature *)instanceMethodSignatureForSelector:(SEL)selector { 
    if (sel_isEqual(selector, @selector(read:maxLength:))) { 
     // Original signature is "[email protected]:*I". Change '*' to '^C' 
     return [NSMethodSignature signatureWithObjCTypes:"[email protected]:^CI"]; 
    } else { 
     return [super instanceMethodSignatureForSelector:selector]; 
    } 
    } 
    - (NSMethodSignature *)methodSignatureForSelector:(SEL)selector { 
    return [[self class] instanceMethodSignatureForSelector:selector]; 
    } 
@end