在以下代码中,最后一个测试失败:
@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]
有没有一种方法可以使用assert循环,同时将空映射视为通过?
答案 0 :(得分: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)
根据您的用例的优势:
答案 1 :(得分: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]
_ | [:]
}