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

时间:2013-02-11 20:34:58

标签: ios cocoa unit-testing bdd

在试验BDD风格的单元测试时,我遇到的墙壁让我退出了整个事情:每个人使用的基本示例都没有包含在多个单元测试之间共享公共断言方法的方法。 / p>

通常,您可能需要设置一组条件,然后对它们执行多个参数化断言。但是块式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中,则断言不起作用,因为它是静态的,而不是在类中。所以你没有得到所有STAsserts都需要的self。如果你试图把它放到PossiblePlace 2中,你就不能,因为它不是一个块。

我最终想出的唯一可能是在SPTSenTestCase上做一个类别,但是你必须传入每一个参数。即,您不能使用_target或任何模拟,因为您不在测试类的上下文中。如果每个测试之间有4个不同的东西,那么4个参数就已经足够了,没有传递给那些有4个东西的东西。

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

1 个答案:

答案 0 :(得分:1)

Specta支持共享示例,这些示例可用于跨多个类共享期望。此问题中的示例:When to use specta's 'sharedExamplesFor'?