Pit*_*try 15 testing user-interface android-jetpack-compose
假设我有 3 个 @Composable 函数:Start、Loading、Result。
在测试中,我调用Start函数,单击其上的Begin按钮,然后调用Loading函数。
Loading函数显示加载过程,需要一些时间,然后调用Result函数。
Result函数呈现一个带有文本OK 的字段。
如何在测试中等待绘制结果 或几秒钟的函数并检查文本是否渲染正常?
composeTestRule
.onNodeWithText("Begin")
.performClick()
// Here you have to wait ...
composeTestRule
.onNodeWithText("OK")
.assertIsDisplayed()
Run Code Online (Sandbox Code Playgroud)
Jos*_*eca 16
编辑:有新的 waitUntil 函数:
fun waitUntilAtLeastOneExists(matcher: SemanticsMatcher, timeout: Long = 1000L)
fun waitUntilDoesNotExist(matcher: SemanticsMatcher, timeout: Long = 1000L)
fun waitUntilExactlyOneExists(matcher: SemanticsMatcher, timeout: Long = 1000L)
fun waitUntilNodeCount(matcher: SemanticsMatcher, count: Int, timeout: Long = 1000L)
Run Code Online (Sandbox Code Playgroud)
您可以waitUntil
按照评论中的建议使用该功能:
composeTestRule.waitUntil {
composeTestRule
.onAllNodesWithText("OK")
.fetchSemanticsNodes().size == 1
}
Run Code Online (Sandbox Code Playgroud)
有人请求改进此 API,但与此同时,您可以从此博客文章中获取帮助程序并按如下方式使用它:
composeTestRule.waitUntilExists(hasText("OK"))
Run Code Online (Sandbox Code Playgroud)
所以选项是:
实现了这样的功能。
fun asyncTimer (delay: Long = 1000) {
AsyncTimer.start (delay)
composeTestRule.waitUntil (
condition = {AsyncTimer.expired},
timeoutMillis = delay + 1000
)
}
object AsyncTimer {
var expired = false
fun start(delay: Long = 1000){
expired = false
Timer().schedule(delay) {
expired = true
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我为测试创建了一个基类并开始编写一个新的测试,我继承并拥有了测试所需的现成功能。