如何在 Kotlin Spek 测试中组织多个协程和期望块?
How organize multiple coroutine and expectation blocks in a Kotlin Spek test?
我写了一个失败的 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 基本上是使用 lambda 编写的,因此为了让 Spek 了解测试树,它必须执行它——这称为发现阶段。在那个阶段组范围(给定,描述,上下文)被执行,在你的情况下 runBlocking { print("a") } 和 runBlocking { print("c") } 被调用。一旦测试树已知,Spek 现在就可以进入执行阶段。在此阶段,Spek 将执行传递给测试 (it) 和操作 (on) 范围的 lambda。
为了解决您的问题,您应该使用操作范围 on 而不是 given.
on("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 基本上是使用 lambda 编写的,因此为了让 Spek 了解测试树,它必须执行它——这称为发现阶段。在那个阶段组范围(给定,描述,上下文)被执行,在你的情况下 runBlocking { print("a") } 和 runBlocking { print("c") } 被调用。一旦测试树已知,Spek 现在就可以进入执行阶段。在此阶段,Spek 将执行传递给测试 (it) 和操作 (on) 范围的 lambda。
为了解决您的问题,您应该使用操作范围 on 而不是 given.
on("a test") {
runBlocking { print("a") }
it("block 1") {
runBlocking { print("b") }
}
runBlocking { print("c") }
it("block 2") {
runBlocking { print("d") }
}
}