在我对Compose UI的测试中,我想测试没有显示任何与我的matcher相匹配的内容.我有两种方法来判断:

  1. onNode(matcher).assertDoesNotExist()
  2. onNode(matcher).assertIsNotDisplayed()

不幸的是,根据我到目前为止的经验,在我的测试中,某些组合项在被移除后会响应"不存在",而其他一些项(尤其是LazyList个项)会响应"不显示".如果它没有显示但仍然存在,assertDoesNotExist()将失败.如果它不存在,assertIsNotDisplayed()将失败.(!)

正如人们所期待的那样,我不在乎Compose是否认为某种东西在技术上"存在",我只想从用户的Angular 测试它是否已经消失了.那么,我怎么能断言这两项中的任何一项都会通过呢?

因为这些是断言,而不是布尔函数,所以我不能使用or.

如果我同时调用这两个断言,肯定会有一个断言失败.

我还没能找到任何语义匹配器,如"显示".如果真的有,我可以

onNode(matcher and isDisplayed()).assertDoesNotExist()

但我找不到isDisplayed个匹配者.

相反的测试很容易,显示的是and存在的东西:assertIsDisplayed()可以做到这一点.我怎么测试assertIsDisplayed()的对立面,它either不存在,or不显示?

推荐答案

有一个issue on the Google Issue Tracker来描述你的问题.

Jetpack编写团队updated 编写编写UI 1.6.0-beta01中测试方法:

保留以供将来重用的子布局(以及基于它的布局,如LazyColumn)被视为已停用.引入了新的assertIsDeactive()测试API来测试这些 node .The rests of the test apis will filter out deactivated nodes by default.(I2ef84,b/187188981)

要获取assertDoesNotExist()assertIsNotDisplayed()的更新行为,请使用以下依赖项:

implementation "androidx.compose.ui:ui:1.6.1" 

您之前需要使用assertIsNotDisplayed()的原因是LazyColumnLazyRow回收项目布局.因此,即使从列表中删除了一个项目,该项目的布局仍然存在,因为它是为另一个项目回收的.由于这些回收 node 现在将被测试方法过滤掉,因此测试方法应按预期运行.
如果要测试某个项布局是否被保留以供回收,可以使用新引入的assertIsDeactivated()断言.

Kotlin相关问答推荐

创建具有共同父类型的两种不同类型对象的列表的最有效方法是什么?

如何将时间值格式化为00:00和00:00:00 Kotlin?""""

判断字符串是否除了.&" ",","@""""

映射中列表类型的Kotlin可空接收器?

在调用父构造函数之前重写类属性

如何在操作系统版本上正确获取Room数据库的路径>;=26 sdk?

创建包含 3 个相同项目的列表/使用返回类型重复

Kotlin SIZE_BYTES

我可以在 Kotlin 中使用接口类型作为构造函数参数吗

OnClickListener 未在 ConstraintLayout 上触发

模拟异常 - 没有找到答案

Jetpack Compose State:修改类属性

无法在Kotlin中使用argb color int值?

参数不匹配;SimpleXML

Kotlin的BiMap/2-way hashmap

从命令行运行Java到Kotlin转换器?

在 Kotlin 函数上使用 Mokito anyObject() 时,指定为非 null 的参数为 null

在android的默认浏览器 Select 列表中添加我的浏览器?

尾随 lambda 语法(Kotlin)的目的是什么?

Kotlin 错误:public function exposes its 'public/*package*/' return type argument