Пробелы в именах методов тестирования при ориентации на мультиплатформенность

Мне очень нравится возможность 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, верно?

Технически вы можете использовать аннотацию @JsName для каждого теста, чтобы указать альтернативное имя, которое будет использоваться для бэкэнда JavaScript, но указание двух разных имен для каждого теста на самом деле не является продуктивным способом работы.

yole 23.07.2018 11:04

@yole, Тем не менее, хороший вариант, о котором нужно знать! Спасибо за комментарий. Однако похоже, что JsName недоступен из библиотеки common?

Steven Jeuris 23.07.2018 11:12

Насколько я понимаю, когда-нибудь будет.

yole 23.07.2018 13:20

Я нашел более подробную документацию по использованию @JsNameна Kotlin Academy. Используя expect и actual, вы можете использовать @JsName. @yole, не стесняйтесь публиковать это в качестве ответа, я считаю, что он подходит для тех, кто не возражает против дублирования имени метода.

Steven Jeuris 23.07.2018 14:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
4
2 348
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Для тестов, которые находятся в общем модуле или модуле 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может используется совместно: это точный вариант использования. Я рассматривал возможность его использования, но эта нотация чрезвычайно избыточна, поэтому я просто выбрал подчеркивание.
Steven Jeuris 28.02.2020 10:20

Для многих это стоит того, чтобы названия тестов были визуально привлекательными.

Jeffrey Nyauke 22.03.2020 14:56

Для меня он работает с Kotlin 1.4.0 даже в обычном режиме с включенной иерархической структурой. Даже без typealias, который уже присутствует в 1.4.0.

shadowsheep 02.09.2020 10:26

Другие вопросы по теме