2

specs2 を使用して Scala でいくつかのテストを実行しようとしていますが、一部のテスト ケースが実行されないという問題が発生しています。

これは私の問題を説明するための最小限の例です。

BaseSpec.scala

package foo

import org.specs2.mutable._

trait BaseSpec extends Specification {
  println("global init")
  trait BeforeAfterScope extends BeforeAfter {
    def before = println("before")
    def after = println("after")
  }
}

FooSpec.scala

package foo

import org.specs2.mutable._

class FooSpec extends BaseSpec {
  "foo" should {
    "run specs" in new BeforeAfterScope {
      "should fail" in {
        true must beFalse
      }
    }
  }
}

テストが失敗すると予想しますが、ネストされたinステートメントの「失敗する必要がある」ケースは実行されないようです。

inネストされたステートメントまたは のいずれかを削除するBeforeAfterScopeと、テストは正しく動作するので、何かが足りないと思いますが、ドキュメントでこれを見つけることができませんでした。

[編集]

私のユースケースでは、現在、メソッドでデータベースにデータを入力し、beforeメソッドでデータベースをクリーンアップしていafterます。ただし、それぞれの間でデータベースをクリーンアップして再度入力することなく、いくつかのテストケースを作成できるようにしたいと考えています。これを行う正しい方法は何ですか?

4

1 に答える 1

11

スコープは、例を作成した場所に正確に作成する必要があります。

class FooSpec extends BaseSpec {
  "foo" should {
    "run specs" in {
      "should fail" in new BeforeAfterScope {
        true must beFalse
      }
    }
  }
}

[更新: specs2 3.x の 2015 年 10 月 12 日]

トレイトから値を継承する必要がない場合は、そこで拡張してandメソッドを定義するBeforeAfterScope方が実際には簡単であることに注意してください。BaseSpecorg.specs2.specification.BeforeAfterEachbeforeafter

一方、すべての例の前後にセットアップ/ティアダウンを行いたい場合は、BeforeAfterAll特性が必要です。両方の特性を使用した仕様は次のとおりです。

import org.specs2.specification.{BeforeAfterAll, BeforeAfterEach}

trait BaseSpec extends Specification with BeforeAfterAll with BeforeAfterEach {
  def beforeAll = println("before all examples")
  def afterAll = println("after all examples")

  def before = println("before each example")
  def after = println("after each example")
}

class FooSpec extends BaseSpec {
  "foo" should {
    "run specs" in {
      "should fail" in {
        true must beFalse
      }
    }
  }
}

このアプローチは、ここに文書化されています。

于 2013-11-04T03:33:12.160 に答える