面向多平台时测试方法名称中的空格

Spaces in test method names when targeting multiplatform

我真的很喜欢 Kotlin 为方法名称添加空格的功能,which is a well-documented approach commonly used to make test names more readable:

In tests (and only in tests), it's acceptable to use method names with spaces enclosed in backticks. (Note that such method names are currently not supported by the Android runtime.) ...

class MyTestCase {
    @Test fun `ensure everything works`() { ... }
    ...
}

我在我正在开发的新库中大力采用它们,目标是 JVM。我的测试在 IntelliJ 中显示得很漂亮,一切都很好。

现在,我正在尝试将此库移植到 multiplatform (targeting both the JVM and JavaScript)。当我添加一个带空格的测试时,当 Gradle build 运行s compileTestKotlin2Js:

时,我收到以下 Kotlin 编译器错误

Name contains illegal chars that can't appear in JavasScript identifier

我应该从我的测试方法中删除所有空格,还是有另一种方法可以两全其美?

另外,关于"such method names are currently not supported by the Android runtime"的限制,这是真的限制吗?只要我可以 运行 我在 JVM 上的测试,我仍然可以使用针对 Android 运行 时间的测试库(在任何方法中不包含空格),对吗?

对于公共模块或 JavaScript 模块中的测试,您是正确的,您将不得不放弃使用反引号的漂亮名称,并求助于更传统的 ensure_everything_works 或相似的。对于特定于 JVM 的测试,您可以继续使用反引号和空格。

这包括您稍后计划 运行 在 Android 上对代码进行的 JUnit 测试。唯一的限制是你不能在 Android 环境中实际必须 运行 的测试中使用空格,但是单元测试(我假设是 JUnit) 运行 在你的开发机器上JVM 所以他们仍然可以在标识符中使用空格。

JavaScript 不允许使用空格进行测试,一旦我们在 JS 模块中尝试 运行 就会出现错误。有一个简单的解决方案:Kotlin/JS提供注解JsName,可以用来在编译代码中指定函数的实际名称。是Kotlin/JS注解,不能用在commonTest模块中。虽然,我们可以像这样在 commonTest 模块的测试源中定义预期的声明:

expect annotation class JsName constructor(val name: String)

在 jsTest 模块上添加 kotlin.js.JsName 注释:

actual typealias JsName = kotlin.js.JsName

定义一些将被其他目标平台忽略的注释:

actual annotation class JsName actual constructor(
    actual val name: String
)

现在,我们需要注释我们的测试:

@JsName("SendAcceptHeaderTest")
@Test
fun `send accept header`() = runTest {
    //...
}

有了这样的声明,我们可以在所有平台上自由地运行我们的测试。