我正在尝试使用 Kotest 编写嵌套测试,这些测试具有每个嵌套级别仅运行一次的钩子。这就是 mocha 在 JavaScript 中的工作方式以及 RSpec 在 ruby 中的工作方式。在 mocha 中,该函数被调用before
。我尝试使用beforeContainer
,但它为每个嵌套容器运行一次,而不是为整个容器运行一次,包括该父容器中的任何嵌套容器。这很难解释,所以下面是一组我希望通过的测试,如果before
kotest 中存在行为类似于 mocha 或 RSpec 的方法。简而言之,每个before
方法应该只被调用一次,并且只有在其容器中的测试运行时(例如,before
内部的方法在"nested level 2"
测试运行之前不应该"nested level 1"
运行)。
package foo.bar
import io.kotest.core.spec.style.DescribeSpec
import io.kotest.matchers.shouldBe
class WidgetTest : DescribeSpec({
var foo = "initial"
var counterOne = 0
var counterTwo = 0
var counterThree = 0
before {
foo = "bar"
counterOne++
}
it("foo should be bar") {
foo shouldBe "bar"
counterOne shouldBe 1
}
it("beforeSpec should have been called only once") {
foo shouldBe "bar"
counterOne shouldBe 1
}
it("counterTwo should be 0") {
counterTwo shouldBe 0
}
it("counterThree should be 0") {
counterThree shouldBe 0
}
describe("nested level 1") {
before {
foo = "buzz"
counterTwo++
}
it("foo should be buzz") {
foo shouldBe "buzz"
}
it("and counterOne should be 1") {
counterOne shouldBe 1
}
it("and counterTwo should be 1") {
counterTwo shouldBe 1
}
describe("nested level 2") {
before {
foo = "jazz"
counterThree++
}
it("foo should be jazz") {
foo shouldBe "jazz"
}
it("and counterOne should be 1") {
counterOne shouldBe 1
}
it("and counterTwo should be 1") {
counterTwo shouldBe 1
}
it("and counterThree should be 1") {
counterThree shouldBe 1
}
}
}
})
before
如果我制作第一个abeforeSpec
和另外两个beforeContainer
(并将它们移动到每个嵌套容器上方),我可以接近我想要的,但随后counterTwo
会增加两次:一次 for"nested level 1"
和一次 for "nested level 2"
。我不确定我是否只是做错了什么,或者这个功能在 kotest 中根本不存在。