まず、2 つの基準を念頭に置いて選択されています!
。^
- 視覚的な混乱を減らす
- 括弧を避けるために必要な相対的な優先順位を持つ
それらが行うことは次のとおりです:!
説明をその説明をテストするコードに関連付け、^
一連の説明、テスト、書式設定注釈、およびその他のサポート コードを、完全なテスト スイートを説明するオブジェクトに連結します。
「受け入れ」仕様のポイントは、それらが純粋に機能であるということです。変更可能な仕様は、変更可能性を利用してコードを「登録」します。たとえば、次のようにします。
"a test" should {
"succeed" in {
success
}
}
それはどの宣言にも関連付けられていません。これはクラス本体 (コンストラクター) 内のステートメントにすぎません。では、Specs2 はどのようにしてそれを検出するのでしょうか? シンプル: コードが実行されると、値または変数が変更され、それ自体が登録されます。
これは、不変仕様ではできないことです。メソッドを実行することでテストが検出されis
、そのメソッドはすべてのテストのリストを返す必要があります。非常にオブジェクト指向で、非構文糖である、それを行う方法を想像してみましょう:
def is = List(
new TestCase("A Test", new TestRule("succeed", success)),
new TestCase("Another test", new TestRule("not fail", success))
)
つまり、メソッド^
が行うのは「テスト ケース」を結合することであり (いわば、実際の Specs2 用語ではありません)、!
「テスト ルール」を「テスト ケース」に関連付けることです。それは以下のように少し動作します - 従来の OO のように見えるように変更しているため、正確ではありません。
"this is my specification" ^
"and example 1" ! e1^
"and example 2" ! e2
new ExampleDescription("this is my specification") ^
new ExampleDescription("and example 1") ! e1^
new ExampleDescription("and example 2") ! e2
// an "Example" is a subclass of "Fragment"
new ExampleDescription("this is my specification") ^
new Example(new ExampleDescription("and example 1"), e1) ^
new Example(new ExampleDescription("and example 2"), e2)
new Fragment(
new ExampleDescription("this is my specification"),
List(
new Example(new ExampleDescription("and example 1"), e1),
new Example(new ExampleDescription("and example 2"), e2)
)
)
new Fragments(
new Fragment(
new ExampleDescription("this is my specification"),
List(
new Example(new ExampleDescription("and example 1"), e1),
new Example(new ExampleDescription("and example 2"), e2)
)
)
)
したがって、受け入れ仕様はフラグメントによって形成されます。フラグメントは、いくつかのコードに関連付けられた記述や、記述の後に他のフラグメントが続くなど、さまざまな方法で構成できます。
自動例、与えられたときの仕様、正規表現エクストラクタ、部分関数、仕様出力の書式設定など、さまざまなニーズに対応するために、その動作方法は非常に複雑です。