如何在BDD风格的Cocoa单元测试中共享断言方法



在尝试BDD风格的单元测试时,我遇到了一堵墙,这让我退出了整个过程:每个人使用的基本示例都不包括在多个单元测试之间共享公共断言方法的方法。

通常,您可能需要设置一组条件,然后对它们执行几个参数化断言。但是块样式的BDD不允许添加这个,就像在普通的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中,断言不起作用,因为它是静态的,而不是在类中。因此,您无法获得所有STAssers都需要的self。如果你试图把它放在PossiblePlace 2中,你不能,因为它不是一个块。

我最终想到的唯一可能性是在SPTSenTestCase上进行分类,但之后必须传入每个参数。也就是说,您不能使用_target或任何mock,因为您不在测试类的上下文中。如果每个测试之间有4个不同的东西,那么4个params就足够了,而不需要传入每一个为这4个东西设置setter的东西。

希望我解释了这个问题,并说明了为什么需要它。感谢您的帮助。

Specta支持共享示例,这些示例可用于在多个类之间共享期望值。这个问题中的示例:何时使用specta';s';sharedExamplesFor';?

最新更新