在空地图上调用每个都失败了

问题描述 投票:2回答:2

在以下代码中,最后一个测试失败:

@Unroll
def "each #map"(Map map) {
    expect:
    map.each{ assert it.value != null }

    where:
    _ | map
    _ | [foo: 1, bar: 1]
    _ | [foo: 1, bar: null]
    _ | [:]
}

..随着消息:

Condition not satisfied:

map.each{ assert it.value != null }
|   |
[:] [:]

我想将空地图视为通行证。

我知道我可以使用“每一个”。即

@Unroll
def "every #map"(Map map) {
    expect:
    map.every{ it.value != null }

    where:
    _ | map
    _ | [foo: 1, bar: 1]
    _ | [foo: 1, bar: null]
    _ | [:]
}

然而,失败消息不那么吸引人。而不是列出坏的值,列表整个集合。当唯一的值是“foo”和“bar”时,这并不是太糟糕,但在处理大型列表时很难阅读。

每个第二个案例:

Condition not satisfied:

it.value != null
|  |     |
|  null  false
bar=null

第二种情况:

Condition not satisfied:

map.every{ it.value != null }
|   |
|   false
[foo:1, bar:null]

有一种方法可以使用断言循环并将空映射视为通过吗?

groovy spock
2个回答
3
投票

你的测试失败是有充分理由的。只需检查以下表达式[:].each { it.value != null }返回的内容。它返回输入的空映射。在这种情况下,Groovy Truth很简单 - 空地图评估为false布尔值。

如果你想将map.each {}与显式断言一起使用,你可以为你的条件添加一个小的“异常” - 你可以明确期望空映射是有效的,对于所有剩余的情况,你检查非空映射中的所有值。

@Unroll
def "each #map"(Map map) {
    expect:
    map == [:] || map.each { assert it.value != null }

    where:
    _ | map
    _ | [foo: 1, bar: 1]
    _ | [foo: 1, bar: null]
    _ | [:]
}

4
投票

如果您对看起来更具说明性并且在断言中给出正确错误的内容感兴趣,您还可以尝试:

[a: null, b: 2, c: 3].findAll{ it.value == null }.isEmpty()

这给了你所有违规的null值作为地图(注意:输出来自Groovy assert而不是Spock):

assert([a: null, b: 2, c: 3].findAll{ it.value == null }.isEmpty())
                             |                           |
                             ['a':null]                  false

        at x.run(x.groovy:1)

优点取决于您的使用案例:

  • 你会看到所有违规的条目
  • 您会看到违规值的所有键
© www.soinside.com 2019 - 2024. All rights reserved.