断言每个对象属性都匹配 kotlin 测试中的给定谓词

Posted

技术标签:

【中文标题】断言每个对象属性都匹配 kotlin 测试中的给定谓词【英文标题】:Assert that every object property matches given predicate in kotlin test 【发布时间】:2022-01-04 21:02:01 【问题描述】:

我有一个对象集合:

data class WeatherForecast(
    val city: String,
    val forecast: String
    // ...
)

我想测试每个项目是否匹配给定的字段谓词。

kotlintest assertions 中是否有任何断言可以让我这样做?

类似:

 forecasts.eachItemshouldMatch it.forecast == "SUNNY" 

【问题讨论】:

据我在kotlin.test 的documentation 中看到的,似乎没有办法收集多个断言的结果。使用 JUnit5,您将能够使用 assertAll 【参考方案1】:

如何使用检查器。

list.forAll 
  it.forecast shouldBe "SUNNY"

https://kotest.io/docs/assertions/inspectors.html

【讨论】:

【参考方案2】:

我最终在 kotest 中提交了 PR,它将提供这样的功能:

https://github.com/kotest/kotest/pull/2692

infix fun <T> Collection<T>.allShouldMatch(p: (T) -> Boolean) = this should match(p)
fun <T> match(p: (T) -> Boolean) = object : Matcher<Collection<T>> 
   override fun test(value: Collection<T>) = MatcherResult(
      value.all  p(it) ,
      "Collection should have all elements that match the predicate $p",
      "Collection should not contain elements that match the predicate $p"
   )

【讨论】:

查看@sksamuel 的回答——应该这样做【参考方案3】:

您可以简单地使用all 函数;即:

forecasts.all  it.forecast == "SUNNY" 

【讨论】:

我想从断言中获得关于哪些项目不符合条件的信息 forecasts.filterNot() 会满足你对@pixel 的期望吗?

以上是关于断言每个对象属性都匹配 kotlin 测试中的给定谓词的主要内容,如果未能解决你的问题,请参考以下文章

更改对象属性以匹配给定数组中的值

断言资源没有属性

在 Spock 中的项目列表上断言

RestAssured API测试框架中的否定断言或否定匹配[关闭]

Kotlin 放心的集合匹配器

接口测试学习——检查结果