Мне очень нравится возможность Kotlin добавлять пробелы в имена методов, это хорошо документированный подход, который обычно используется для повышения читабельности имен тестов.:
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, и все в порядке.
Теперь я пытаюсь перенести эту библиотеку на мультиплатформенность (ориентирована как на JVM, так и на JavaScript). Когда я добавляю тест с пробелами, я получаю следующую ошибку компилятора Kotlin, когда Gradle build
запускает compileTestKotlin2Js
:
Name contains illegal chars that can't appear in JavasScript identifier
Следует ли мне удалить все пробелы из моих методов тестирования или есть другой способ получить лучшее из обоих миров?
Кроме того, что касается ограничения, что «такие имена методов в настоящее время не поддерживаются средой выполнения Android», является ли это реальным ограничением? Пока я могу запускать свои тесты на JVM, я все еще могу использовать протестированную библиотеку (не содержащую пробелов ни в одном из методов) для среды выполнения Android, верно?
@yole, Тем не менее, хороший вариант, о котором нужно знать! Спасибо за комментарий. Однако похоже, что JsName
недоступен из библиотеки common
?
Насколько я понимаю, когда-нибудь будет.
Я нашел более подробную документацию по использованию @JsName
на Kotlin Academy. Используя expect
и actual
, вы можете использовать @JsName
. @yole, не стесняйтесь публиковать это в качестве ответа, я считаю, что он подходит для тех, кто не возражает против дублирования имени метода.
Для тестов, которые находятся в общем модуле или модуле JavaScript, вы правы, вам придется отказаться от красивых имен, используя обратные кавычки, и прибегнуть к более традиционному ensure_everything_works
или аналогичному. Для тестов, специфичных для JVM, вы можете продолжать использовать обратные кавычки и пробелы.
Сюда входят тесты JUnit для кода, который вы позже планируете запускать на Android. Единственное ограничение заключается в том, что вы не можете использовать пробелы в тестах, которые на самом деле должны запускаться в среде Android, но модульные тесты (я предполагаю, что JUnit) запускаются на JVM вашей машины разработчика, поэтому они все равно будут работать с пробелами в идентификаторах. .
JavaScript не допускает тестов с пробелами, и мы получим ошибку при попытке запустить его в модуле JS. Есть простое решение: Kotlin / JS предоставляет аннотацию JsName, которую можно использовать для указания фактического имени функции в скомпилированном коде. Это аннотация Kotlin / JS, поэтому ее нельзя использовать в модуле commonTest. Хотя мы можем определить ожидаемое объявление в тестовых источниках модуля commonTest следующим образом:
expect annotation class JsName constructor(val name: String)
Сделайте аннотацию kotlin.js.JsName в модуле jsTest:
actual typealias JsName = kotlin.js.JsName
Определите аннотацию, которая будет игнорироваться для других целевых платформ:
actual annotation class JsName actual constructor(
actual val name: String
)
Теперь нам нужно аннотировать наши тесты:
@JsName("SendAcceptHeaderTest")
@Test
fun `send accept header`() = runTest {
//...
}
С такими объявлениями мы можем свободно запускать наши тесты на всех платформах.
@JsName
может используется совместно: это точный вариант использования. Я рассматривал возможность его использования, но эта нотация чрезвычайно избыточна, поэтому я просто выбрал подчеркивание.
Для многих это стоит того, чтобы названия тестов были визуально привлекательными.
Для меня он работает с Kotlin 1.4.0 даже в обычном режиме с включенной иерархической структурой. Даже без typealias, который уже присутствует в 1.4.0.
Технически вы можете использовать аннотацию
@JsName
для каждого теста, чтобы указать альтернативное имя, которое будет использоваться для бэкэнда JavaScript, но указание двух разных имен для каждого теста на самом деле не является продуктивным способом работы.