Существует ли действительно мультиплатформенная установка для тестирования функций Jetbrains @Composable?
Я хотел бы иметь возможность получить
@Composable
контекст, работающий в цели моего общего проекта, чтобы протестировать компоненты более высокого порядка, которые находятся в
commonMain
, такие как ContentLocalProviders и макеты. Что-то типа:
@Test fun testSomethingComposable() = runComposeTest {
@Composable fun <M> buildMutableState(model: M) { /* ... */ }
assertNotNull { buildMutableState(initialState).value }
}
я начал с
expect fun runComposeTest(content: @Composable ()->Unit)
Внутри
commonTest
, но работает только версия. В
createComposeRule().setContent {}
Функция, предлагаемая AndroidX, работает только в инструментальном тесте.
Есть ли другой способ обойти это? Между тем, я только что сократил свои тесты, чтобы двигаться дальше.
В
jvmTest
версия:
import androidx.compose.ui.window.application
actual fun runComposeTest(content: @Composable () -> Unit) = runTest {
application(false) {content}
}
Но следующее терпит неудачу в
androidTest
:
actual fun runComposeTest(content: @Composable () -> Unit) = runTest {
val rule = createComposeRule()
rule.setContent(content)
}
... По несколько очевидным причинам.
1 ответ
Оказывается, у них есть тестовая среда, которая, насколько мне известно, не была анонсирована и не упоминается в документации. Я добавил суть с полным build.gradle.kts .
Но в основном вы хотите добавить
org.jetbrains.compose.ui:ui-test-junit4
к вашему проекту. Я использую альфа-версию программного обеспечения, так что:
kotlin { sourceSets {
val commonTest {
dependencies {
/* ... */
implementation(kotlin("test-junit"))
implementation(kotlin("test-common"))
implementation("org.jetbrains.compose.ui:ui-test-junit4:1.2.0-alpha01-dev620")
}
}
val jvmMain by getting {
dependencies {
/**
* Note this is needed for tests to run.
**/
implementation(compose.desktop.currentOs)
}
}
val jvmTest by getting {
dependencies {
implementation("junit:junit:4.13.2")
}
}
}
Эти тесты в настоящее время не работают под JUnit5, или я где-то читал (извините, без ссылки). Поэтому обратите внимание на явное
kotlin("test-junit")
вместо
"test"
, который загрузит junit5.