如何用协同程序对Kotlin-JS代码进行单元测试?

时间:2017-12-23 22:14:09

标签: kotlin kotlinx.coroutines

我创建了一个多平台的Kotlin项目(JVM& JS),宣布了一个预期的类并实现了它:

// Common module:
expect class Request(/* ... */) {
    suspend fun loadText(): String
}

// JS implementation:
actual class Request actual constructor(/* ... */) {
    actual suspend fun loadText(): String = suspendCoroutine { continuation ->
        // ...
    }
}

现在我尝试使用kotlin.test进行单元测试,对于JVM平台,我只需使用runBlocking,如下所示:

@Test
fun sampleTest() {
    val req = Request(/* ... */)
    runBlocking { assertEquals( /* ... */ , req.loadText()) }
}

如果没有runBlocking

,如何在JS平台上重现类似的功能?

1 个答案:

答案 0 :(得分:3)

虽然已经很晚了,但是有一个开放的issue可以增加在js-tests中使用suspend函数的可能性(这个函数将透明转换为promise)

解决方法

可以在通用代码中定义:

expect fun runTest(block: suspend () -> Unit)

使用

在JVM中实现
actual fun runTest(block: suspend () -> Unit) = runBlocking { block() }

和JS一起

actual fun runTest(block: suspend () -> Unit): dynamic = promise { block() }