2011-05-02 3 views
1

아이폰 앱 유닛 테스트에는 모든 테스트 케이스 클래스를 포함하는 하나의 테스트 슈트가 있습니다. 이 스위트의 setUp/tearDown에서 DB의 일부 엔티티를 생성/삭제하는 일반적인 설정/해제를 수행합니다. setUp에서는 NSAsserts를 사용하여 모든 것이 올바르다 고 주장합니다. 문제는 setUp에서 문제가 발생하면 NSAssert가 충돌을 일으키고 tearDown이 호출되지 않아 DB가 치료되지 않는 것입니다.OCUnit 테스트 스위트 tearDown이 어떻게 호출되는지 확인 하시겠습니까?

tearDown이 항상 호출되어 DB가 항상 깨끗한 지 확인하는 가장 좋은 방법은 무엇입니까? NSAsserts를 사용하지 않을 수도 있습니까? 그렇다면 테스트 프레임 워크에 테스트 케이스를 실행하지 말라고하는 방법은 무엇입니까?

감사합니다.

답변

1

오른쪽, NSAssert를 사용하지 마십시오. 대신 :

  • 별도의 도우미 방법으로 데이터베이스 설정을 가져옵니다.
  • 성공적으로 설정된 내용을 나타내는 인스턴스 변수를 설정하십시오.
  • STFail 성공적으로 설정되지 않은 항목.
  • 각 테스트가 적절한 도우미 메서드를 호출하도록하십시오.
  • -tearDown에서 인스턴스 변수를 검사하여 정리해야 할 항목을 확인하십시오.

예 :도이 같은 테스트는 깨지기 쉬운 만드는 데이터베이스에 cruft에 떠날 수있는 잠재력을 가지고

@interface DatabaseTest : SenTestCase 
{ 
    BOOL removeTestDataInTearDown; 
} 

- (void)addTestDataToDatabase 
{ 
    BOOL success; 
    // Attempt to add data to database. Set success according to results. 
    if (!success) 
     STFail(@"Unable to add test data to database", nil); 
    removeTestDataInTearDown = YES; 
} 

- (void)removeTestDataFromDatabase 
{ 
    // Remove data from database. 
} 

- (void)tearDown 
{ 
    if (removeTestDataInTearDown) 
     [self removeTestDataFromDatabase]; 

    [super tearDown]; 
} 

- (void)testSomething 
{ 
    [self addTestDataToDatabase]; 
    // Execute test using data. 
} 

참고. 따라서 실제 데이터베이스 호출 대신 모의 객체를 사용하는 다른 테스트 세트로 이러한 테스트를 보완 할 수 있습니다.

2

모든 것이 올바르게 설정되면 setUp에 설정된 테스트 스위트에 부울 ivar를 추가하는 것이 좋습니다. 그런 다음 NSAssert가이 변수를 설정하는 것으로 대체됩니다 (예 : STAssert에 의해 플래그가 지정됩니다. 문제가 발생하면 테스트가 실패하게됩니다.

각 테스트 케이스에서 검사를 수행하기 전에이 ivar이 맞는지 확인하십시오 (예 :

이 방법을 사용하면 tearDown이 항상 호출되고 그에 따라 정리할 수 있습니다.

+0

[super setUp]가 없습니다. –

관련 문제