10

我真的很喜欢 Kotlin 为方法名称添加空格的能力,这是一种有据可查的方法,通常用于使测试名称更具可读性

在测试中(并且仅在测试中),可以使用带有反引号的空格的方法名称。(请注意,Android 运行时当前不支持此类方法名称。) ...

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

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

现在,我正在尝试将此库移植为多平台(针对 JVM 和 JavaScript)。当我添加带有空格的测试时,我在 Gradlebuild运行时收到以下 Kotlin 编译器错误compileTestKotlin2Js

名称包含不能出现在 JavaScript 标识符中的非法字符

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

另外,关于“Android运行时目前不支持此类方法名称”的限制,这是真正的限制吗?只要我可以在 JVM 上运行测试,我仍然可以使用针对 Android 运行时的测试库(在任何方法中都不包含空格),对吗?

4

2 回答 2

3

对于通用模块或 JavaScript 模块中的测试,您是对的,您将不得不放弃使用反引号的好名称,而使用更传统ensure_everything_works或类似的名称。对于特定于 JVM 的测试,您可以继续使用反引号和空格。

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

于 2018-07-23T09:03:55.570 回答
0

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 {
    //...
}

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

于 2020-02-28T05:52:04.470 回答