Должна ли ошибка утверждения возвращать соответствующую позицию в списке вместо объекта?

#scala #unit-testing #automated-tests

Вопрос:

 test("Comparison") {
  val list: List[String] = List("Thing", "Entity", "Variable")
  val expected: List[String] = List("Thingg", "Entityy", "Variablee")
  var expectedPosition = 0
  for (item <- list) {
    assert(list(expectedPosition) == expected(expectedPosition))
    expectedPosition  = 1
  }
}
 

В Scala, чтобы сделать мои низкоуровневые тесты кода более читабельными, я подумал, что было бы неплохо просто использовать одно утверждение, чтобы оно повторялось по циклу и в конце увеличивало накопитель.
Это делается для проверки нескольких входных данных одновременно, когда несколько входных данных будут более или менее иметь одинаковые атрибуты. Когда утверждение терпит неудачу, оно возвращается как «Вещь []», не равная «Вещи[g]». Вместо того, чтобы сообщать об ошибке элемента в списке, есть ли способ заставить его напрямую указать позицию в списке без объединения позиции в списке перед утверждением или с помощью условного оператора, возвращающего позицию в списке? Как будто я предпочел бы, чтобы все это содержалось в отчете об ошибке assert ().

Комментарии:

1. assert принимает необязательный строковый аргумент, в который можно включить дополнительную информацию

Ответ №1:

 val expected: LazyList[String] = ...

expected.zip(list)
        .zipWithIndex
        .foreach{case ((exp,itm),idx) =>
          assert(exp == itm, s"off at index $idx")
        }

//java.lang.AssertionError: assertion failed: off at index 0
 

expected ленив, так что его пересекают только один раз, хотя он дважды застегивается.