我真的很喜欢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运行时的经过测试的库(在任何方法中均不包含空格),对吗?
答案 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 {
//...
}
有了这样的声明,我们可以在所有平台上自由运行测试。