4

specs2 で、「親」テストが例外をスローせずに結果を返した場合にのみ実行されるサブテストのパターンを表現する適切な方法は何ですか?

functionmaybeGiveMeAThingがあり、 を返すか、Thing例外をスローすることができます。

呼び出しは次のようになります。

val thing: Thing = maybeGiveMeAThing("foo", "bar" "baz")

特定の入力セットをmaybeGiveMeAThing使用して、例外をスローせずに Thing を正常に返すことをテストし、返された Thing を使用して、さらにテストを行い、 にThing指定されたパラメーターに対して正しいものが返されることを確認しますmaybeGiveMeAThing

テストを現在セットアップしている方法では、への呼び出しがmaybeGiveMeAThing例外をスローすると、テスト スイート全体が中止されます。これは私が好むロジックです:

  • aThingが正常に返された場合は、thing の内容を分析する一連のサブテストに進みます
  • maybeGiveMeAThing例外 (すべての例外) がスローされた場合は、分析するサブテストをスキップしますが、残りのテストを続行します

私の既存のテストコードはおおよそ次のようになります。

// ...
"with good parameters" in {
  var thing: Thing = null   

  "return a Thing without throwing an exception" in {
    thing = maybeGiveMeAThing("some", "good", "parameters", "etc.")
  } should not(throwA[Exception])


  "the Thing returned should contain a proper Foo" in {
       thing.foo mustBe "bar"

  }
    //... etc ...
}

// ...

}

...しかし、これは正しい方法とはかけ離れているように感じます。適切な方法は何ですか?
(できれば s の使用は避けたいと思いvarます。)

4

2 に答える 2

4

1 つの可能性は、@alexwriteshere の回答のように条件を使用することです。

"parent test" in {
  val thing: Option[Thing] = maybeGiveMeAThing("foo", "bar" "baz")

  thing match {
    case Some(thing) =>
      "child test 1" in ok
      "child test 2" in ok
    case None =>
      "skipped tests" in skipped
  }
}

ただし、メソッドのブロックが許容可能なタイプになるようExampleに、ケースに を追加する必要があります。Nonein

ただし、このアプローチの大きな欠点は、仕様が定義されている間に実行されることです。この意味は:

  • に例外があるmaybeGiveMeAThing場合、仕様全体が爆発します
  • を使用して例を除外することを選択した場合thingでも、ビルド中です。

別のオプションは、Step以前の失敗は次のすべての例をスキップするということわざを使用することです。

class MySpec extends mutable.Specification {
  "This is a test with a thing" >> {
    lazy val thing: Option[Thing] = maybeGiveMeAThing("foo", "bar" "baz")

    "the thing should be ok" >> {
      thing must beOk
    }

    step(stopOnFail = true)
    "other examples with thing" >> {
      "ex1" >> ok
      "ex2" >> ok
    }
  }
}
于 2013-03-22T03:50:48.980 に答える
3

子ケースを使用した単純な if/else は、あなたが望むことを行います。または、「maybeGiveMeAThing」メソッドがオプションを返すようにして、それを照合することもできます。

"parent test" in {
      val thing: Option[Thing] = maybeGiveMeAThing("foo", "bar" "baz")

      thing match {
        case Some(thing) =>
          "child test 1" in {
            ...
          }

          "child test 2" in {
            ...
          }
        case None =>
          // don't run additional tests
      }
    }

MaybeGiveMeAThing例外を返さなければならない場合は、例外をキャッチして、メソッドが Option を返すようにすることができます。

于 2013-03-21T16:42:12.180 に答える