Compose 桌面测试 - 如何检查某些内容是否可见?
Compose Desktop testing - how to check if something is visible?
给出一些简单的内容:
@Composable
fun MyContent() {
var showThing by remember { mutableStateOf(false) }
if (showThing) {
Box(Modifier.testTag("thing")) {
Text("The Thing")
}
}
}
如果我尝试测试该东西是否已显示:
@OptIn(ExperimentalTestApi::class)
class Scratch {
@get:Rule
val compose = createComposeRule()
@Test
fun test() {
runBlocking(Dispatchers.Main) {
compose.setContent {
MyContent()
}
compose.awaitIdle()
compose.onNodeWithTag("thing").assertIsNotDisplayed()
}
}
}
我明白了:
An operation is not implemented.
kotlin.NotImplementedError: An operation is not implemented.
at androidx.compose.ui.test.DesktopAssertions_desktopKt.checkIsDisplayed(DesktopAssertions.desktop.kt:23)
at androidx.compose.ui.test.AssertionsKt.assertIsNotDisplayed(Assertions.kt:49)
at Scratch$test.invokeSuspend(Scratch.kt:44)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
...
我认为测试是否显示某些东西是最基本的测试,但框架还不支持。测试框架是实验性的,所以我期待找到缺失的东西,但不是这样的。
有没有其他我没有找到的方法?那里的所有教程都在谈论 assertIsDisplayed()
,但也许还有其他选择?
它不是直接替代品,但不幸的是,JB Compose Desktop 在 UI 测试套件中存在这些限制。除了仅使用 JUnit 4,并且与较新版本不兼容外,许多断言方法和屏幕交互方法未实现,例如您尝试使用的 .assertIsNotDisplayed()
以及 [=12= 之类的操作].
您的问题的替代方法是使用其他方法,例如 .assertDoesNotExist()
和 .assertExists()
。
它不会告诉你元素是否在屏幕的边界内并且可见,但至少会告诉你你的节点存在并且被实例化了,这是有总比没有强的。
在 JetBrains 实现完整的桌面测试套件之前,我们需要使用现有的东西,或者尝试实现一些东西作为解决方法。
在您的情况下,这将起作用:
@OptIn(ExperimentalTestApi::class)
class Scratch {
@get:Rule
val compose = createComposeRule()
@Test
fun test() {
runBlocking(Dispatchers.Main) {
compose.setContent {
MyContent()
}
compose.awaitIdle()
compose.onNodeWithTag("thing").assertDoesNotExist()
}
}
给出一些简单的内容:
@Composable
fun MyContent() {
var showThing by remember { mutableStateOf(false) }
if (showThing) {
Box(Modifier.testTag("thing")) {
Text("The Thing")
}
}
}
如果我尝试测试该东西是否已显示:
@OptIn(ExperimentalTestApi::class)
class Scratch {
@get:Rule
val compose = createComposeRule()
@Test
fun test() {
runBlocking(Dispatchers.Main) {
compose.setContent {
MyContent()
}
compose.awaitIdle()
compose.onNodeWithTag("thing").assertIsNotDisplayed()
}
}
}
我明白了:
An operation is not implemented.
kotlin.NotImplementedError: An operation is not implemented.
at androidx.compose.ui.test.DesktopAssertions_desktopKt.checkIsDisplayed(DesktopAssertions.desktop.kt:23)
at androidx.compose.ui.test.AssertionsKt.assertIsNotDisplayed(Assertions.kt:49)
at Scratch$test.invokeSuspend(Scratch.kt:44)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
...
我认为测试是否显示某些东西是最基本的测试,但框架还不支持。测试框架是实验性的,所以我期待找到缺失的东西,但不是这样的。
有没有其他我没有找到的方法?那里的所有教程都在谈论 assertIsDisplayed()
,但也许还有其他选择?
它不是直接替代品,但不幸的是,JB Compose Desktop 在 UI 测试套件中存在这些限制。除了仅使用 JUnit 4,并且与较新版本不兼容外,许多断言方法和屏幕交互方法未实现,例如您尝试使用的 .assertIsNotDisplayed()
以及 [=12= 之类的操作].
您的问题的替代方法是使用其他方法,例如 .assertDoesNotExist()
和 .assertExists()
。
它不会告诉你元素是否在屏幕的边界内并且可见,但至少会告诉你你的节点存在并且被实例化了,这是有总比没有强的。
在 JetBrains 实现完整的桌面测试套件之前,我们需要使用现有的东西,或者尝试实现一些东西作为解决方法。
在您的情况下,这将起作用:
@OptIn(ExperimentalTestApi::class)
class Scratch {
@get:Rule
val compose = createComposeRule()
@Test
fun test() {
runBlocking(Dispatchers.Main) {
compose.setContent {
MyContent()
}
compose.awaitIdle()
compose.onNodeWithTag("thing").assertDoesNotExist()
}
}