2013-02-11 47 views
0

在试用BDD风格的单元测试时,我碰到了让我退出整个事情的墙:每个人使用的基本示例都不包括在多个单元测试之间共享常用断言方法的方法。如何在BDD风格的可可单元测试中共享断言方法?

通常,您可能需要设置一组条件,然后对它们执行几个参数化的断言。但块式BDD不允许你添加这个,就像你可以在SenillaCase中一样。基本例如,使用Specta,虽然这可能适用于任何人:

// PossiblePlace 1 

SpecBegin(ClassUnderTest) 

    describe(@"ClassUnderTest", ^{ 
     __block ClassUnderTest* _target; 

     beforeEach(^{ 
      _target = [[ClassUnderTest alloc] init]; 
     }); 

     // PossiblePlace 2 

     it(@"does thing 1 under some circumstances", ^{ 
      // Lots of assertions 
     }); 

     it(@"does thing 1 under some other circumstances", ^{ 
      // Lots of assertions again 
     }); 

     afterEach(^{ 
      [_target release]; 
     }); 
    }); 

SpecEnd 

假设你有10个断言。我不想在每次测试中都使用这些。这样,每个测试都很好,并且可读性只与每个测试用例之间的不同之间的内容相关。通常它会是这样的:

- (void)assert_LotsOfStuff:(BOOL)expectedResult 
{ 
    BOOL result = [_target someOp]; 
    STAssertEquals(result, expectedResult, nil); 
    // Etc. 
} 

但是在这里你不能这样做。如果您尝试将assert_LotsOfStuff放入PossiblePlace 1,断言不起作用,因为它是静态的,而不是在类中。所以你不会得到所有STAssert需要的self。如果你试图将它放入PossiblePlace 2,你不能,因为它不是一个块。

我终于想出了唯一的可能性是在SPTSenTestCase上做一个类别,但是你必须传入每一个参数。也就是说,你不能使用_target或任何mock,因为你不在测试类的上下文中。如果每项测试有4个不同的东西,那么4个参数已经足够了,而不会传递每一个为这4个东西做准备的东西。

希望我解释了这个问题,并说明了为什么需要它。任何帮助赞赏。

回答

相关问题