测试动画

Compose 提供了 ComposeTestRule,它允许您以确定性方式编写动画测试,并完全控制测试时钟。这使您可以验证中间动画值。此外,测试的运行速度可能比动画的实际持续时间更快。

ComposeTestRule 将其测试时钟公开为 mainClock。您可以将 autoAdvance 属性设置为 false 以在测试代码中控制时钟。启动要测试的动画后,可以使用 advanceTimeBy 将时钟向前移动。

需要注意的是,advanceTimeBy 不会将时钟精确地移动指定的持续时间。相反,它会将其四舍五入到最接近的持续时间,该持续时间是帧持续时间的倍数。

@get:Rule
val rule = createComposeRule()

@Test
fun testAnimationWithClock() {
    // Pause animations
    rule.mainClock.autoAdvance = false
    var enabled by mutableStateOf(false)
    rule.setContent {
        val color by animateColorAsState(
            targetValue = if (enabled) Color.Red else Color.Green,
            animationSpec = tween(durationMillis = 250)
        )
        Box(Modifier.size(64.dp).background(color))
    }

    // Initiate the animation.
    enabled = true

    // Let the animation proceed.
    rule.mainClock.advanceTimeBy(50L)

    // Compare the result with the image showing the expected result.
    // `assertAgainGolden` needs to be implemented in your code.
    rule.onRoot().captureToImage().assertAgainstGolden()
}