2011-05-02 52 views
1

在我们的iPhone应用程序单元测试中,我们有一个包含所有测试用例类的测试套件。在套件的setUp/tearDown中,我们执行常规设置/拆卸操作,创建/删除数据库中的一些实体。在setUp中,我们使用NSAsserts来断言一切正确。 问题是,如果setUp中出现问题,NSAssert会导致crash和tearDown未被调用,导致数据库不清晰。如何确保调用OCUnit测试套件tearDown?

什么是确保拆卸总是被调用,所以数据库总是干干净净的最佳方式?也许不使用NSAsserts?但那么如何告诉测试框架不运行测试用例呢?

谢谢。

回答

1

权,不要使用NSAssert。相反:

  • 将数据库设置拖入单独的帮助器方法。
  • 设置实例变量以指示已成功设置的内容。
  • STFail上任何未成功建立。
  • 让每个测试调用适当的帮助器方法。
  • -tearDown,检查实例变量,看需要清洗了一下。

例子:

@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

我建议你在测试套件中添加一个boolean ivar,当所有设置都正确时,它将在setUp中设置。 NSAssert然后被替换为设置这个变量,例如。由STAssert标记......万一出现任何问题,将导致测试失败。

在每个试验情况下,你然后检查此的ivar之前执行检查,例如是真通过使用这样的事情:

-(void)setUp { 
    // Perform the setup of the testbed and setting testBedStable accordingly 
    STAssertTrue(testBedStable, @"Failed to setup test environment"; 
} 

-(void)testSomething { 
    if(testBedStable) { 
    // Perform tests 
    } 
    else 
    STFail(@"Unable to perform test case"); 
} 

这种方法将确保拆除总是被调用,并可以相应地清理。

+0

你缺少[super setUp]。 – 2012-11-08 20:00:35

相关问题