Существует ли действительно мультиплатформенная установка для тестирования функций 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.