init
에서 다른 개체를 반환 할 수 있습니다. 그래서 [super init]
의 반환 값을 self
에 할당해야합니다. 다음과 같이 시도하십시오.
@implementation Bar
- (id)init {
if (UNIT_TEST) {
self = [[StubBar alloc] init];
if (self) {
// do unit test init here
}
} else {
self = [super init];
if (self) {
// do regular init here
}
}
return self;
}
...
@end
참고 : 이것은 ARC에서 작동해야합니다. ARC를 사용하지 않는 경우 새 StubBar
인스턴스를 할당하기 전에 self
을 출시해야합니다. 당신이 당신의 주요 목표로 단위 테스트 관련 코드를 컴파일하지 않도록하려면
:
@implementation Bar
- (id)init {
#if UNIT_TEST
self = [[StubBar alloc] init];
if (self) {
// do unit test init here
}
#else
self = [super init];
if (self) {
// do regular init here
}
#endif
return self;
}
...
@end
당신은 완전히 분리 된 단위 테스트와 실제 코드, 당신이 당신 Bar
의 두 가지 버전을 가질 수 원하는 경우 수업. 하나는 실제 코드로 컴파일되고 다른 하나는 유닛 테스트 대상으로 컴파일됩니다.
당신은 쉽게 다음과 같이 컴파일시에 정확한 클래스 유형을 알지 못하고, 인스턴스를 할당 할 수 있습니다 :
id someBar = [[someClass alloc] init]; // assuming someClass is of type Class
또는 :
id someBar = [[NSClassFromString(@"Bar") alloc] init];
첫 번째는하지만 바람직하다. 이것을 사용하여 단위 테스트를 수행 할 때 변경할 수있는 기본 클래스 유형을 가질 수 있습니다. Foo
의 속성 또는 단위 테스트시 다시 정의하는 전처리 매크로.
단위 테스트를위한 코드가 "실생활"코드와 혼용되지 않을 것입니다. 어떻게 다르게 동작하는지 테스트가 잘되었는지 확신 할 수 있습니까? –
@JonathanCichon 단위 테스트를 할 때 공통점이 있다고 생각합니까? 특정 객체 또는 함수 (이 경우 'Foo'와 같은)를 테스트하려는 경우에는 다른 이유로 완벽한 테스트 환경을 설정할 수있는 것은 아닙니다. 어쩌면'Foo'는 실제로 테스트와 관련이없는'Bar' 속성을 가져야합니다. – DrummerB
아래에서 언급했듯이 단위 테스트에만 사용되는 경우 내 주요 타겟에 컴파일되는 내용을 추가하지 않는 것이 좋습니다. –