0

BDD スタイルの単体テストを試しているときに、壁にぶつかり、すべてをやり直すことになりました。誰もが使用する基本的な例には、複数の単体テスト間で共通の assert メソッドを共有する方法が含まれていません。

多くの場合、一連の条件を設定し、それらに対していくつかのパラメーター化されたアサーションを実行する必要があります。しかし、ブロック スタイルの 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.
}

しかし、ここではそれができません。PossiblePlace 1に配置しようとするとassert_LotsOfStuff、クラスではなく静的であるため、アサーションは機能しません。selfしたがって、すべての STAssert が必要とする を取得できません。それをPossiblePlace 2に入れようとしても、ブロックではないので入れられません。

私が最終的に思いついた唯一の可能性は、 でカテゴリをSPTSenTestCase実行することですが、その場合はすべてのパラメーターを渡す必要があります。つまり、テスト クラスのコンテキストにないため、_target やモックを使用することはできません。各テスト間で 4 つのものが異なる場合、4 つのパラメータで十分に理解できます。これら 4 つのセッターを持つすべてのものを渡す必要はありません。

うまくいけば、私は問題を説明し、なぜそれが必要なのかを主張しました. どんな助けでも感謝します。

4

1 に答える 1

1

Specta は共有例をサポートしています。これらは、複数のクラス間で期待を共有するために使用できます。この質問の例: Specta の 'sharedExamplesFor' を使用する場合は?

于 2014-02-03T21:34:41.990 に答える