Вызов каждого на пустой карте не удался - PullRequest
2 голосов
/ 20 марта 2019

В следующем коде последний тест не пройден:

@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 }
|   |
[:] [:]

Я бы хотел считать пустую карту пассом.

Я знаю, что могу использовать «каждый». * 1009 Т.е. *

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

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

Однако сообщения об ошибках менее привлекательны. Вместо того, чтобы перечислить неправильное значение, список всей коллекции. Это не так уж плохо, когда единственными значениями являются «foo» и «bar», но очень трудно читать при работе с большими списками.

* 1014 Т.е. *

2-й случай с каждым:

Condition not satisfied:

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

2-й случай с каждым:

Condition not satisfied:

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

Есть ли способ использовать цикл assert и обрабатывать пустую карту как проход?

Ответы [ 2 ]

4 голосов
/ 21 марта 2019

Если вас интересует что-то, что выглядит более декларативно и дает правильную ошибку в утверждении, вы также можете попробовать:

[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)

Преимущества в зависимости от вашего варианта использования:

  • Вы видите все оскорбительные записи
  • Вы видите все клавиши для ошибочных значений
3 голосов
/ 20 марта 2019

Ваш тест не пройден по уважительной причине.Просто проверьте, что возвращает следующее выражение [:].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]
    _ | [:]
}
...