2013-05-15 3 views
14

, 나는 여기에 직면하고 문제는 내가 CGRect을 반환 foo을 하나의 방법이라는 한이 방법은 다른 방법 <code>callFoo</code>에서 호출, 난 그냥 <code>OCMock</code> 연습했다

이다 충돌합니다.

-(CGRect)foo { 
    return CGRectMake(10, 10, 10, 10); 
} 
-(void)callFoo { 
    CGRect rect = [self foo]; 
    NSLog(@"%@",NSStringFromCGRect(rect)); 
} 

callFoo 방법에 대한 나의 단위 테스트는 우는 소리입니다. 이 CGRect rect = [self foo];
나는 우리가이 충돌을 해결하기 위해 mocked method 방법에서 CGRect를 반환 할 경우이 충돌이 일어나는 이유를 알고 싶어 도달하면

- (void)test__callFoo__invokesWithMockingFoo 
{ 
    ViewController *sut = [[ViewController alloc] init]; 
    id master = [OCMockObject partialMockForObject:sut]; 

    CGRect rect = CGRectMake(0, 0, 0, 0); 
    [[[master expect] andReturnValue:OCMOCK_VALUE(rect)] foo]; 
    [sut callFoo]; 
    [master verify]; 
} 

이 테스트 케이스를 실행

, 나는 예기치 않은 충돌을 얻고있다.

이 문제를 해결하는 데 도움이 될 수 있습니까?

미리 감사드립니다.

P.S : CGRect를 NSValue로 바꿔도 괜찮습니다.

-(NSValue *)foo { 
     return [NSValue valueWithCGRect:CGRectMake(10, 10, 10, 10)]; 
    } 
    -(void)callFoo { 
     CGRect rect = [[self foo] CGRectValue]; 
     NSLog(@"%@",NSStringFromCGRect(rect)); 
    } 

내 테스트 케이스에서 As shown below,

NSValue *rect = [NSValue valueWithCGRect:CGRectMake(0, 0, 0, 0)]; 
[[[master expect] andReturn:rect] foo]; 

갱신 :
이 메모리에 문제처럼 보인다 [하지만 난 그냥 추측 확실하지 않다].

변수가 2 double이거나 구조가 3 CGFloat 인 구조를 만들면 모의가 적용된 메서드는 2 CGFloat 인 구조를 만들면 정확한 구조를 제공합니다. :)

재미있는

+3

이것은 OCMock의 버그 인 것 같습니다.결국 foo가 부분 모의 (partial mock) 내에서 null 구현을 가리키게됩니다. foo를 직접 호출하면 테스트를 통과 할 수 있음을 알았을 수도 있습니다. foo를 다른 클래스에 넣고 조롱하는 것이 (대단히 큰) 해결책이 될 것입니다. –

+0

OCMock의 버그인지 여부는 확실하지 않지만, CGRect ie와 유사한 사용자 지정 구조체로 시도했을 때. struct는 두 개의 변수 (struct1 & struct2)를 포함합니다. 그러나 결과는 동일합니다. 하지만 구조체 즉 struct1과 struct2에 변수가 하나만 포함되어 있으면 테스트가 통과합니다 –

+1

이것은 OCMock의 버그입니다 (https://github.com/erikdoe/ocmock/pull/41). 풀 요청에 대한 주석을 보면 왜 일부 (일반적으로 큰) 구조체에만 문제가 있는지 알 수 있습니다. –

답변

0

OCMockbug 것 같다. 그것은 지금 고쳐졌다.

4

OCMOCK_VALUE은 (BOOL, NSInteger, 등) 기본 요소 일반적으로는 OCMOCK_VALUE은 다음 링크에 따라, 구조체와 잘 작동하지 않는 것 같다.

당신이 게시물 OCMock Return a struct에 의해 제공되는 카테고리를 사용하는 경우, 당신은 같은 것을 수행 할 수 있습니다 또는

- (void)test__callFoo__invokesWithMockingFoo { 
    ViewController *sut = [[ViewController alloc] init]; 
    id master = [OCMockObject partialMockForObject:sut]; 

    CGRect rect = CGRectMake(0, 0, 0, 0); 
    [[[master expect] andReturnStruct:&rect objCType:@encode(CGRect)] foo]; 
    [sut callFoo]; 
    [master verify]; 
} 

을, 당신은 사용할 수 있습니다 OCMOCK_STRUCT fr 톰은 Using a struct with OCMock or Hamcrest

- (void)test__callFoo__invokesWithMockingFoo { 
    ViewController *sut = [[ViewController alloc] init]; 
    id master = [OCMockObject partialMockForObject:sut]; 

    CGRect rect = CGRectMake(0, 0, 0, 0); 
    [[[master expect] andReturn:OCMOCK_STRUCT(CGRect, rect)] foo]; 
    [sut callFoo]; 
    [master verify]; 
} 
+0

나는'CGRect rect = {0, 0, 0, 0};을 시도했다. NSValue * valRect = [NSValue valueWithBytes : & rect objCType : @encode (CGRect)]; [[[master expect] andReturnValue : valRect] foo];'하지만 충돌했습니다. –

+0

'[[[master expect] andReturn : valRect] foo]; '를 시도 했습니까? – catcyborg

+0

그래, 나는 여전히 같은 결과를 시도했다. –