kotlin - 如何在 Kotlin Spek 测试中组织多个协程和期望 block ?

标签 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") }
    }
}

我期望打印 abcd,但实际上打印了 acbd

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

最佳答案

Spek 基本上是使用 lambda 编写的,因此为了让 Spek 了解测试树,它必须执行它 - 这称为发现阶段。在该阶段中,执行组范围(给定、描述、上下文),在您的情况下 runBlocking { print("a") }runBlocking { print("c") }> 被调用。一旦知道了测试树,Spek 现在就可以进入执行阶段。在此阶段,Spek 将执行传递给 test (it) 和 action (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") }
    }
}

关于kotlin - 如何在 Kotlin Spek 测试中组织多个协程和期望 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46940718/

相关文章:

kotlin - 在 IntelliJ IDEA 项目中使用 kotlinx.coroutines

android - java.lang.ClassNotFoundException : com. intellij.junit5.JUnit5IdeaTestRunner 在 kotlin 中使用 spek

java - Spek 测试未在 Maven Java 项目中运行

java - Kotlin Spek 中的组执行顺序错误

android - Android是否具有键盘监听器来检测按下了哪个键?

java - 找不到属性 setter 方法 setAlpha

android - 使用 kotlin.UByte 作为房间实体不起作用

android - Kotlin Coroutines 等到完成 init block

nullable - Kotlin mutableMap.put 返回可为空

android-studio - 编译错误: "-Xcoroutines has no effect: coroutines are enabled anyway in 1.3 and beyond"