Seb*_* LG 13 android android-testing android-jetpack-compose
使用最新版本的 Compose 1.2.0 运行 Robolectric 单元测试时,测试createAndroidComposeRule失败并出现以下错误:
MyActivity 已经设置了内容。如果您已使用 ComposeView 填充 Activity,请确保在该 ComposeView 上调用 setContent,而不是在测试规则上调用;并确保
setContent {}在 ComposeTestRule 运行后完成调用
来自失败测试之一的代码:
composeTestRule.setContent {
Column {
Text(textTitle)
DemoScopedInjectedViewModelComposable()
}
}
Run Code Online (Sandbox Code Playgroud)
cor*_*her 27
仔细观察,错误消息有很大帮助,即使它谈论的是 aComposeView而不是Activity。但根据它:
composeTestRule.setContent { ... }
Run Code Online (Sandbox Code Playgroud)
应改为:
composeTestRule.activity.setContent { ... }
Run Code Online (Sandbox Code Playgroud)
并且测试应该运行而不会再出现此错误。
1.2 Compose禁止覆盖活动规则的内容。但这仍然可以通过直接在活动上设置内容来完成,而不是活动测试规则。
解决此问题的最简单方法是不在活动规则上设置内容,而是在活动本身上设置内容。可以这样做:
composeTestRule.activity.runOnUiThread {
composeTestRule.activity.setContent {
Column {
Text(textTitle)
}
}
}
Run Code Online (Sandbox Code Playgroud)
为了简化使用,您可以使用以下扩展
fun <R : TestRule, A : ComponentActivity> AndroidComposeTestRule<R, A>.setContentOnActivity(
content: @Composable () -> Unit
) {
this.activity.runOnUiThread {
this.activity.setContent {
content()
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3848 次 |
| 最近记录: |