2014-11-13 2 views
-2

내 응용 프로그램에는 싱글 톤 클래스가 있습니다. 다음과 같이 구현 :객관적인 싱글 톤 - 단위 테스트를 실행할 때 재설정되지 않음

이 클래스의 헤더 파일은 codedatamanager 같은 단일 속성의 모든 종류가
@implementation PTKRGlobal 
static PTKRGlobal *instance = nil; 

+(PTKRGlobal *)shared 
{ 
    @synchronized(self) 
    { 
     if(instance==nil) 
     { 
      instance= [PTKRGlobal new]; 
     } 
    } 
    return instance; 
} 

:

[[PTKRGlobal shared] coreDataManager] 

이 나를 사용하여 관리자를 호출 할 수 있습니다

@interface PTKRGlobal : NSObject 
+(PTKRGlobal *)shared; 
@property (strong, nonatomic) PTKRCoraDataManager *coreDataManger; 

을 appdeleget에서 관리자를 설정했습니다.

[[PTKRGlobal shared] setCoreDataManger:[PTKRCoraDataManager new]]; 

유닛 테스트를 실행할 때 일부 차이점이있는 서브 클래 싱 된 PTKRCoreDataManager가 있습니다. 그러나 단위 테스트에서 코어 데이터 관리자를 설정하려고 시도하면 [[PTKRGlobal shared] setCoreDataManger:[PTKRTestCoreDataManager new]]; 변수가 이미 설정되어 있고 재 할당 할 수 없습니다. 추정치 PTKRGlobal은 유닛 테스트가 실행되기 전에 실행되는 기능 테스트가 실행되는 동안 생성됩니다. 나는 앱 위임에 중단 점을 넣고 단위 테스트 setUp과 출력을 비교하여 확인했습니다. po [[PTKRGlobal shared] coreDataManager]

unittest를 시작하기 전에이 싱글 톤을 어떻게 재설정 할 수 있습니까?

+ (void)destroySingleton { 
    instance = nil; 
} 

를 그리고 단위 테스트의 tearDown 방법에 전화 :

+0

추출 :

그런 다음 단위 테스트의 @implementation 위의 단위 테스트에 대한 .m에 다음을 추가합니다. 유닛 테스트 싱글 톤이 아니라면 삶이 훨씬 쉬워 질 것입니다! :-) – Jocke

답변

1

클래스에 메서드를 추가합니다.


참고로, 당신은 아마 실제 응용 프로그램에서 공개적으로 노출하고 싶지 않은

- (void)tearDown { 
    [PTKRGlobal destroySingleton]; 
    [super tearDown]; 
} 

, 그래서 당신의 .m 파일에이 방법을 추가 할 수 있습니다. 다른 클래스에 테스트 할 것을

@interface PTKRGlobal (UnitTesting) 
+ (void)destroySingleton 
@end 
+0

작동하지 않습니다. 나는 싱글 톤이'[PTKRGlobal destroySingleton];을 실행 한 후에'instance = [PTKRGlobal new];에 중단 점을 넣음으로써 파괴되었다는 것을 확인했다. PTKRTestCoreDataManager * coreDataManager = [PTKRTestCoreDataManager new]; [[PTKRGlobal 공유] setCoreDataManger : coreDataManager]; '. 나는 이전과 이후에 싱글 톤을 파괴하기 전에 포 [[PTKGlobal 공유] coreDataManager]를 확인했고 그것들은 동일합니다. –

+0

그렇다면 "작동하지 않는 것"이라는 의미는 무엇입니까? 당신은 싱글 톤이 파괴되었음을 확인했다고 말합니다 ... – nhgrif

+0

싱글 톤은 새로운 것이 생성 될 때 파괴되는 것처럼 보입니다.하지만 coreDataManager는 싱글 톤 파괴 전후에 동일하게 보입니다. –

관련 문제