我真的很喜欢Kotlin在方法名称中添加空格的能力,这是一种文档丰富的方法,通常用于提高测试名称的可读性:
在测试中(并且仅在测试中(,可以使用用反引号括起来的空格。(请注意,此类方法名称为目前Android运行时不支持。(。。。
class MyTestCase { @Test fun `ensure everything works`() { ... } ... }
我在开发的一个新库中大力采用了它们,该库的目标是JVM。我的测试在IntelliJ中显示得很好,一切都很好。
现在,我正试图将这个库移植到多平台(同时针对JVM和JavaScript(。当我添加带有空格的测试时,当Gradlebuild
运行compileTestKotlin2Js
:时,我收到以下Kotlin编译器错误
Name包含无法出现在JavasScript标识符中的非法字符
我应该从测试方法中删除所有空格,还是有其他方法可以两全其美
此外,关于"Android运行时目前不支持此类方法名称"的限制,这是真正的限制吗?只要我能在JVM上运行测试,我仍然可以使用针对Android运行时的测试库(在任何方法中都不包含空格(,对吗?
对于公共或JavaScript模块中的测试,您是正确的,您将不得不使用backticks放弃漂亮的名称,而使用更传统的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 {
//...
}
有了这样的声明,我们可以在所有平台上自由运行测试。