在尝试 BDD 风格的单元测试时,我碰壁了,这让我退出了整个事情:每个人都使用的基本示例不包括在多个单元测试之间共享公共断言方法的方法。
通常,您可能需要设置一组条件,然后对它们执行几个参数化断言。但是块式 BDD 不允许您添加它,就像您可以在 vanilla SenTestCase 中一样。基本示例,使用 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,则断言不起作用,因为它是静态的,而不是在类中。所以你没有得到self
所有 STAsserts 都需要的 。如果您尝试将其放入 PossiblePlace 2 中,则不能,因为它不是一个块。
我最终想出的唯一可能性是在 上做一个类别SPTSenTestCase
,但是你必须传入每个参数。即,您不能使用 _target 或任何模拟,因为您不在测试类的上下文中。如果每个测试之间有 4 件事不同,那么 4 个参数已经足够理解了,而无需传递对这 4 件事有设置器的每一件事。
希望我解释了这个问题并说明了为什么需要它。任何帮助表示赞赏。