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 つのセッターを持つすべてのものを渡す必要はありません。
うまくいけば、私は問題を説明し、なぜそれが必要なのかを主張しました. どんな助けでも感謝します。