2011-12-11 3 views
1

지연을 가지고 다른 메소드를 호출하는 블랙 박스 유닛 테스트를 작성하고 싶습니다. 그것은 좀 다음과 같습니다 kDelay가 일정하고 doSomethingLaterObjective-C에서 지연된 메소드를 유닛 테스트하기

- (void) doSomething { 
    // Do something 
    [self performSelector:@selector(doSomethingLater) withObject:nil afterDelay:kDelay]; 
} 

- (void) doSomethingLater { } 

은 비공개입니다. 문제는 kDelay이 1 초이며 단위 테스트의 실행 속도를 늦추고 싶지 않다는 것입니다.

단위 테스트 doSomething을 블랙 박스 방식 (또는 가능한 한 많이)하는 가장 좋은 방법은 무엇입니까?

유일한 생각은 클래스에 메서드를 추가하여 kDelay 값을 변경하는 것이지만 다른 개발자가 실수로 사용할 수 있습니다. 덜 침략적 인 대안이 있습니까?

답변

0

덜 침략적인지는 잘 모르겠지만 지연되지 않는 자신의 버전으로 -[NSObject performSelector:withObject:afterDelay:] 메서드를 사용할 수 있습니다.

Swizzling은 런타임에 메서드 구현을 대체한다는 것을 의미합니다. 무료 JRSwizzle library을 확인하십시오.

+0

나는 그것이 다른 방식으로 침략 적이라고 말하고 싶습니다. –

+0

이 접근법의 문제점은 어떤 이유로 누군가 다른 사람이 연기 한 performSelector를 지연 시키려고 결정하면 테스트가 느려지고 아무도 이유를 알 수 없다는 것입니다. – hpique

+0

그래도 상상할 수 있으면 좋을 것입니다. – hpique

0

내가보고있는 첫 번째 방법은 메서드가 실행되었음을 감지하는 것입니다. 그래서 @ Rob이 말했듯이, 나는 다른 방법으로 혼란을 겪을 것입니다. 테스트에 로컬 일 가능성이 높습니다. 부울을 호출했음을 나타내는 부울을 설정합니다.

다음 문제는 지연을 줄이는 것입니다. KDelay는 상수이기 때문에 실제로 그것에 대해 아무 것도 할 수 없습니다. 테스트 및 설정에서 액세스 할 수있는 사유 재산 또는 다른 것으로 변경할 수 있지만 프로덕션 코드는 여전히 사적입니다.

다른 옵션 (가능한지 알아보기 위해 조사하지 않은)은 실행되는 메소드를 감지하는 것에 대해별로 신경 쓰지 않아도되지만 호출이 실행 루프 스택인지 감지 할 수 있는지, 처형되기를 기다리고있다. 호출 자체가 아니라 보류중인 호출의 존재를 감지 할 수 있으면 즉시이를 수행 할 수 있으며 지연이 부적절 해집니다.

0

테스트에서 doSomethingLater가 호출되었고 그것이 수행 한 작업을 수행했는지 확인하려는 경우 시간 지연이 단축됩니다. 그렇다면 doSomething에 상수 값을 반환하는 private 메서드를 만드는 것이 좋습니다. 같은 뭔가 :

@implementation MyClass 

- (NSUInteger) getDelay { 
    return kDelay; 
} 

@end 

그런 다음 당신은 OCMock 다른 테스트 프레임 워크 같은 것들의 다양한 기능을 사용하여 런타임에 getDelay의 구현을 스텁 수 있습니다.

관련 문제