如何在Kotlin Spek测试中组织多个协同程序和期望块?

如何在Kotlin Spek测试中组织多个协同程序和期望块?,kotlin,kotlinx.coroutines,spek,Kotlin,Kotlinx.coroutines,Spek,我编写了一个失败的Spek测试,因为我对涉及多个协同程序和it函数的执行顺序做出了错误的假设: given("a test") { runBlocking { print("a") } it("block 1") { runBlocking { print("b") } } runBlocking { print("c") } it("block 2") { runBlocking { print("d") }

我编写了一个失败的Spek测试,因为我对涉及多个协同程序和
it
函数的执行顺序做出了错误的假设:

given("a test") {
    runBlocking { print("a") }

    it("block 1") {
        runBlocking { print("b") }
    }

    runBlocking { print("c") }

    it("block 2") {
        runBlocking { print("d") }
    }
}
我希望打印
abcd
,但实际打印的是
acbd


我应该如何编写这个测试,使它能够以预期的顺序直观地读取和执行

Spek基本上是使用lambdas编写的,因此为了让Spek了解测试树,它必须执行它——这称为发现阶段。在这个阶段,执行组作用域(给定、描述、上下文),在您的例子中,调用runBlocking{print(“a”)}和runBlocking{print(“c”)}。一旦知道测试树,Spek现在就可以进入执行阶段。在此阶段,Spek将执行传递给测试(it)和操作(on)范围的lambda

作为问题的解决方案,您应该在上使用操作范围,而不是给定范围

on("a test") {
    runBlocking { print("a") }

    it("block 1") {
        runBlocking { print("b") }
    }

    runBlocking { print("c") }

    it("block 2") {
        runBlocking { print("d") }
    }
}