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