1

Scala と Spec2 を使い始めたばかりです。ただし、spec2 での受け入れスタイルについては少し混乱しています。

誰かが私にそれを説明してもらえますか ! の機能は何ですか? この場合は ^ です。ドキュメントを読みましたが、まだよくわかりません。単体テストのパターンは理解できたのですが、この部分が非常にわかりにくいです。


  "this is my specification"                          ^
    "and example 1"                                   ! e1^
    "and example 2"                                   ! e2

  def e1 = success
  def e2 = success

この例はhttp://etorreborre.github.com/specs2/guide/org.specs2.guide.Structure.htmlから取得しました

どうもありがとうございました。

4

2 に答える 2

4

まず、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)
    )
  )
)

したがって、受け入れ仕様はフラグメントによって形成されます。フラグメントは、いくつかのコードに関連付けられた記述や、記述の後に他のフラグメントが続くなど、さまざまな方法で構成できます。

自動例、与えられたときの仕様、正規表現エクストラクタ、部分関数、仕様出力の書式設定など、さまざまなニーズに対応するために、その動作方法は非常に複雑です。

于 2012-06-10T04:51:55.140 に答える
3

それは非常に簡単です。ページに書かれているように^、フラグメントのリストを作成します。フラグメントは、文字列、コード ブロックが添付された説明 ("説明" ! ブロック)、またはp空白行のような制御要素のいずれかです。したがって、あなたの例は次のように読むことができます:

Description("this is my specification") and
  Description("and example 1").withBlock(e1) and
  Description("and example 2").withBlock(e2)

def is =これは、spec クラスの上部にあるの本体として割り当てられます。内部でこのリストが処理され、説明ごとにコンソールに出力される行があり、ブロックの結果 (ある場合) に応じて異なる色で表示されます。

要約すると、テスト ランナーによって処理される項目のリストを作成します。

于 2012-06-09T11:07:43.847 に答える