цвет кнопки подтверждения - MaterialTheme.colors.primary в составном

У меня есть простая кнопка. Его набор цветов устанавливается на основе условия, и я хочу проверить, что правильный цвет применяется из MaterialTheme, но тест не проходит, говоря @Compos

      @Composable
fun Btn(shopState: Int) {
    //set color based on the state now, default being primary
    var color = MaterialTheme.colors.primary
     if (shopState == 2) {...}
     else if (shopState == 3) {...}
    Button(onClick = {
        /*
         call calculation method passing the current value of shopState
        */
    }) {
        Text(text = "Calculate", color = color)
    }
}

Тестовый файл сейчас (скопирован из SO):

      fun SemanticsNodeInteraction.assertButtonColor(expectedColor: Color) {
    val capturedName = captureToImage().colorSpace.name
    assertEquals(expectedColor.colorSpace.name, capturedName)
}

но когда я сделаю:

      composeTestRule.onNodeWithText("Calculate").assertButtonColor(MaterialTheme.colors.primary)

он не запускается с красной линией под свойством цветов MaterialTheme: вызовы @Composable могут происходить только из @Composables.

Как я могу утверждать, что MaterialTheme.colors.primary применяется в настоящее время?

1 ответ

Вы можете использовать что-то вроде:

      import com.google.common.truth.Truth.assertThat

@Test
fun bottonColorTest() {
    var onPrimary = Color.Transparent
    var content = Color.Transparent
    rule.setContent {
        onPrimary = MaterialTheme.colors.onPrimary
        Button(onClick = {}) {
            content = LocalContentColor.current
        }
    }

    assertThat(content).isEqualTo(onPrimary)
}

Чтобы импортироватьcom.google.common.truth.Truth.assertThatдобавьте в свою зависимость:

      androidTestImplementation "com.google.truth:truth:1.1.3"