2012-11-21 3 views
1

테스트 사례와 도우미 클래스가 있습니다.도우미 클래스의 어설 션이 무시되었습니다.

MainTests.h

#import <SenTestingKit/SenTestingKit.h> 

@interface HelperClass : SenTestCase 

- (void)fail; 

@end 

#import <SenTestingKit/SenTestingKit.h> 

@interface MainTests : SenTestCase 

@end 

MainTests.m

#import "MainTests.h" 
#import "HelperClass.h" 

@implementation MainTests 

- (void)testExample { 
    HelperClass *helperClass = [[HelperClass alloc] init]; 
    [helperClass fail]; 
} 

@end 

HelperClass.h을 : 도우미에서 내가 사용하고자하는 클래스는 여기에서도 같은 주장

HelperClass.m

#import "HelperClass.h" 

@implementation HelperClass 

- (void)fail { 
    STFail(@"This should fail"); 
} 

@end 

(!) 참고 : 나는 주장 매크로에 액세스 할 수있는에 SenTestCase에서 헬퍼 클래스를 서브 클래스를했습니다.

도우미 클래스의 어설 션은 무시됩니다. 어떤 아이디어? 헬퍼 클래스에서 어서션을 사용하려면 어떻게해야합니까?

답변

5

나는이 동일한 문제를 오늘 가지고 있었고, 내 목적을 위해 작동하는 해킹을 생각해 냈습니다. SenTestCase 매크로를 쳐다 보면서, 나는 그들이 도우미에게 [self ...]라고 부르지 만 어설트를 유발하지는 않는다는 것을 알아 차렸다. 따라서 소스 클래스를 도우미에 연결하면 저에게 효과적입니다. 귀하의 질문에 클래스 변경의 모습 :

MainTests.h

#import <SenTestingKit/SenTestingKit.h> 

@interface MainTests : SenTestCase 

@end 

MainTests.m

#import "MainTests.h" 
#import "HelperClass.h" 

@implementation MainTests 

- (void)testExample { 
    // Changed init call to pass self to helper 
    HelperClass *helperClass = [[HelperClass alloc] initFrom:self]; 
    [helperClass fail]; 
} 

@end 

HelperClass.h

#import <SenTestingKit/SenTestingKit.h> 

@interface HelperClass : SenTestCase 

- (id)initFrom:(SenTestCase *)elsewhere; 
- (void)fail; 

@property (nonatomic, strong) SenTestCase* from; 

@end 

HelperClass.m

#import "HelperClass.h" 

@implementation HelperClass 

@synthesize from; 

- (id)initFrom:(SenTestCase *)elsewhere 
{ 
    self = [super init]; 
    if (self) { 
     self.from = elsewhere; 
    } 
    return self; 
} 

- (void)fail { 
    STFail(@"This should fail"); 
} 

// Override failWithException: to use the source test and not self 
- (void) failWithException:(NSException *) anException { 
    [self.from failWithException:anException]; 
} 

@end 

이 추가 재 지정 고급 기능에 필요한 전적으로 가능하지만 나를 위해 트릭을했다.

+0

멋진 트릭. 많은 도우미 클래스에 약간의 노동력이 필요합니다. 당신은 Upvote를 얻었고 더 좋은 해결책이 없다면 나는이 대답을 받아 들일 것입니다. – fabb

+1

나는 fail 메소드와 이니셜 라이저로 도우미 슈퍼 클래스를 만들었다. 기본적인 어설 션이 필요할 경우, 정기적 인'NSAssert'를 사용하는 것이 더 쉽습니다. 비록 OCHamcrest를 사용할 때 아무런 생각이 들지 않습니다. – fabb

관련 문제