2012-07-31 1 views
9

나는 핵심 데이터에 관한 단위 테스트를 받기 위해 this great article을 따랐다. 설치가 간단 해 보이며 코드의 일부 뷰 라인 만 포함됩니다.파일 기반 코어 데이터를 사용하지 않고 메모리를 사용하도록 MagicalRecord에 지시 할 수 있습니까?

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

- (void)tearDown; 
{ 
    [MagicalRecord cleanUp]; 
} 

- (void)testSomeCalculationOnMyEntity; 
{ 
    NSNumber *count = [MyEntity MR_numberOfEntities]; 
    // STAssert([testEntity customCalculation] == expectedValue, @"expected a good calculation"); 
} 

@end 

문제마다 I (상기와 같은) [MyEntity MR_numberOfEntities] 호출하여 코어 데이터의 설정 메모리에있는 엔티티의 양 예컨대 검사, I는, 오브젝트의 양을 얻을 수 있다는 인 파일에 저장됩니다. 설정은이며 몇 천 개가 넘습니다. 어떻게 될까요? setUp에있는 두 번째 줄은 메모리 하나를 나타냅니다. 그렇습니까? 그리고이 경우에는 저장된 객체의 양으로 0이 반환됩니다.

의견을 보내 주셔서 감사합니다.

편집 :

는 바른 길에 나를 넣어 @casademora. 다음 작업 설정은 현재 잘 작동합니다.

- (void)setUp; 
{ 
    [MagicalRecord cleanUp]; // This solved the mystery. 

    // I don't now why I had to remove this line, though. 
    // [MagicalRecord setDefaultModelWithClass:[self class]]; 

    [MagicalRecord setupCoreDataStackWithInMemoryStore]; 
} 

- (void)tearDown; 
{ 
    [MagicalRecord cleanUp]; 
} 

- (void)testSomeCalculationOnMyEntity; 
{ 
    NSNumber *count = [MyEntity MR_numberOfEntities]; 
    // STAssert([testEntity customCalculation] == expectedValue, @"expected a good calculation"); 
} 

@end 

답변

1

여기서 코어 데이터를 설정하는 데 사용되는 방법은 파일 기반 저장소를로드해서는 안됩니다. 디버거를 사용하여 단계를 밟으면 NSInMemoryStore 유형을 사용하여 영구 저장소 코디네이터가 초기화된다는 것을 알 수 있습니다.

이전 테스트 케이스에 cleanUp 호출을 추가하지 않았고 이전 코어 데이터 스택 또는 영구 저장소가이 테스트에 영향을 미치지 않았기 때문에 이러한 현상이 발생할 수 있습니다.

이것은 테스트 코어 데이터를 항상 단위 테스트하는 데 사용되는 정확한 코드 설정이며 의도하지 않은 영구 저장소를로드 한 적이 없습니다. 메서드로 디버깅 할 때 다음 명령을 실행하십시오.

po [self persistentStores] 

영구 저장소 코디네이터가로드되면이 명령을 실행하십시오. 기존 점포가있는 경우 적어도 일부 기존 점포가 있는지 확인합니다.

+0

답장을 보내 주셔서 감사합니다. 내가 달리고있는 시험 만이 유일한 시험입니다. 내 테스트의 대상은 내 응용 프로그램의 대상에 따라 다릅니다. 내 AppdDelegate에서 핵심 데이터 스택 파일을 사용하도록 설정합니다. 이 테스트는 테스트 전에로드되고, 따라서 새 메모리 대신 사용됩니다. 그렇다면 어떻게 이것을 피할 수 있습니까? – Aufwind

+0

나를 바른 길로 인도 해 주셔서 감사합니다. 나는'- (void) setUp;'메서드에서'[MagicalRecord setupCoreDataStackWithInMemoryStore];의 직전에'[MagicalRecord cleanUp];을 호출하여이 수수께끼를 풀었습니다. 나는 [MagicalRecord setDefaultModelFromClass : [self class]];를 제거해야만했다. 내 질문 편집을 참조하십시오. – Aufwind

+0

와우, 그럴 필요는 없어야합니다 ... tearDown 메소드에서 cleanUp을 호출하면 충분했습니다. 이것은 아주 이상합니다. – casademora

1

클래스 초기화시 한 번 수행되는 다음을 추가 할 수도 있습니다. 이것은 나를 위해 일했다.

+(void)setUp 
    { 
      [MagicalRecord cleanUp]; 
    } 
관련 문제