2013-07-09 3 views
4

코어 데이터를 사용하는 iOS 앱과 함께 지속성을 관리하는 우수 Magical Record이 있습니다. 여기 내 문제가 있습니다 :Core Data 및 Magical Record로 iOS 응용 프로그램 단위 테스트

우리의 기존 단위 테스트 구조는 표준 iOS 응용 프로그램 테스트를 사용합니다. 각 테스트마다 깨끗한 메모리 내 db로 단위 테스트를 실행하고 싶습니다. 나는 this article에있는 지침을 따라 마법 레코드를 사용하여이를 설정했다. 이 문제는 응용 프로그램 테스트 실행의 구현에서 나타납니다. 응용 프로그램 테스트는 응용 프로그램 번들을 먼저 실행 한 다음 단위 테스트 번들을 실행하므로 내 메모리 저장소 호출이 실행되기 전에 핵심 데이터 스택을 설정하기위한 정상적인 호출이 호출되고 있습니다.

나는 밤새도록이 문제를 인터넷 검색, 유망한 기사의 몇 가지 발견 :

이들의 문제는 그들이 싱글 데이터 액세스 개체를 사용하고 있는지입니다 핵심 데이터 호출에 대한 게이트웨이로 내 응용 프로그램이 이런 식으로 설정되어 있지 않습니다. 내 데이터 가져 오기 및 저장을 위해 Magical Record에 전화를 사용하고 있습니다.

누구에게이 문제가 발생 했습니까? 그렇다면 테스트가 실행 중일 때 메모리 내 저장소로 데이터 설정을 바꿀 수있는 세부 사항이 누락 되었습니까?

편집 : 추가 코드

내 애플 대리자에서, 나는이있다 :

-(void)setUp{ 
    [super setUp]; 
    [MagicalRecord setDefaultModelFromClass:[self class]]; 
    [MagicalRecord setupCoreDataStackWithInMemoryStore]; 
} 

-(void)tearDown{ 
    [MagicalRecord cleanUp]; 
    [super tearDown]; 
} 
: 핵심 데이터를 다루는 모든 단위 테스트 클래스에서

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ 
    [MagicalRecord setupAutoMigratingCoreDataStack]; 
    // Other setup code 
    return YES; 
} 

을,이이

각 응용 프로그램 위임 코드와 setup/teardown이 각 테스트마다 호출되지만 테스에 대한 기본 코어 데이터 스택을 만드는 방법을 모르겠습니다. t는 메모리 저장소를 사용합니다. 또한 .xcdatamodel 파일을 단위 테스트 대상에 추가했습니다.

+0

을 : 그냥은 다음과 같이해야하므로 현재 데이터 스택 정말 설정 메모리 저장소를 찢어 setUp에서 [MagicalRecord setupCoreDataStackWithInMemoryStore];에 호출하기 전에

[MagicalRecord cleanUp]; 

전화 설정 범위를 좁힐 수 있습니까? 나는 당신이 한 가지를 놓치고 있다고 생각하지만, 당신이하는 일을 보면서 그것이 무엇인지 알지 못합니다. – casademora

+0

@casademora - 내가하는 일을 설명하는 코드가 추가되었습니다. 나는 또한 CocoaPods를 사용하여 Magical Record를 가져 왔는데, 그게 문제와 관련이 있는지는 확실하지 않습니다. –

+1

hrm, 응용 프로그램 테스트를 실행해야합니까? 이 경우 테스트 설정을 사용하지 않아야합니다. 논리 테스트를 사용하는 경우 블로그 게시물에 지정된 설정이 올바르게 작동합니다. 또한 응용 프로그램과 논리 테스트의 차이점이 있다는 것을 싫어합니다 :/ – casademora

답변

0

문제점을 올바르게 이해 한 경우 을 setUp 번으로 호출 한 후에도 실제 데이터 저장소에 액세스하는 것이 문제가됩니까?

데이터베이스 상호 작용을 담당하는 객체에 대한 단위 테스트를 작성할 때 약간의 디버깅과 함께 동일한 문제가 발생했습니다. 문제가 있음을 발견했습니다. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions에서

[MagicalRecord setupAutoMigratingCoreDataStack];setUp에서 [MagicalRecord setupCoreDataStackWithInMemoryStore];보다 일찍이라고합니다. 그리고 우리가 MagicalRecord에 의해 핵심 데이터 스택을 만드는 것이 얼마나 효과적인지 살펴 본다면, 우리는 그 문제가 무엇인지 이해할 것입니다.

+ (void) setupCoreDataStackWithInMemoryStore; 
{ 
    if ([NSPersistentStoreCoordinator MR_defaultStoreCoordinator] != nil) return; 

    NSPersistentStoreCoordinator *coordinator = [NSPersistentStoreCoordinator MR_coordinatorWithInMemoryStore]; 
    [NSPersistentStoreCoordinator MR_setDefaultStoreCoordinator:coordinator]; 

    [NSManagedObjectContext MR_initializeDefaultContextWithCoordinator:coordinator]; 
} 

[NSPersistentStoreCoordinator MR_defaultStoreCoordinator]는 메모리 저장소를 설정하는 시점에서 전무하지 않고 그 자동으로 아무것도하지 않고 반환하는 방법 위에 있습니다. 그리고 그 시점에서 당신은 인 메모리 저장소 대신 실제 데이터 저장소를 남겨 둡니다. 해결책은 간단합니다.일부 샘플 당신이 코드 또는 프로젝트가 있습니까

- (void)setUp{ 
    [super setUp]; 
    [MagicalRecord setDefaultModelFromClass:[self class]]; 
    [MagicalRecord cleanUp]; 
    [MagicalRecord setupCoreDataStackWithInMemoryStore]; 
}