定位多平台时测试方法名称中的空格

时间:2018-07-23 09:00:23

标签: kotlin kotlin-multiplatform

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

  

在测试中(且仅在测试中),可以将方法名称与   用反引号括起来的空格。 (请注意,此类方法名称为   当前不受Android运行时支持。)...

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

我已经在我开发的针对JVM的新库中大力采用了它们。我的测试在IntelliJ中显示精美,一切都很好。

现在,我正在尝试将此库移植为multiplatform (targeting both the JVM and JavaScript)。当我添加带有空格的测试时,当Gradle build运行compileTestKotlin2Js时,我收到以下Kotlin编译器错误:

  

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

我应该从测试方法中删除所有空格,还是有另一种方法可以同时兼顾两者?

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

2 个答案:

答案 0 :(得分:1)

对于在公共模块或JavaScript模块中的测试,您是正确的,您必须使用反引号放弃好听的名称,并采用更传统的ensure_everything_works或类似名称。对于特定于JVM的测试,您可以继续使用反引号和空格。

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

答案 1 :(得分: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 {
    //...
}

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