Scala specs2嵌入了上下文

时间:2013-11-03 22:43:08

标签: scala specs2

我正在尝试使用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方法清理它。但是,我希望能够在没有清理的情况下拥有多个测试用例,并在每个测试用例之间重新填充数据库。 什么是正确的方法呢?

1 个答案:

答案 0 :(得分:10)

必须在创建示例的位置创建范围:

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

[更新时间:10-12-2015 for specs2 3.x]

请注意,如果您不需要继承BeforeAfterScope特征中的值,那么让BaseSpec扩展org.specs2.specification.BeforeAfterEach并定义before和那里有after方法。

另一方面,如果您想在所有示例之前和之后进行一些设置/拆卸,则需要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
      }
    }
  }
}

此方法记录在案here