ПОСЛЕ ЧЕГО КОММЕНТАРИИ И выясняли, как это работает, я все еще думаю:Specs2 ломает мои тестовые данные, из-за, как он работает с итератора
Было бы хорошо, хотя, если specs2 обеспечивает нон расходными логики, вдоль с расходными материалами для итераторов. Как, если я не использую iterator.size метод напрямую, метод , но использовать Спекуляции, как: haveSize
У меня есть тест, который имеет код:
val ids = for(software <- parser) yield software.productID
//ids.size must_== 2;
ids.foreach(x => println(x))
It производит вывод:
1
2
Если я раскомментировать spec2 чек (ids.size must_== 2
), это обеспечит пустой выход ,
Кажется, spec2, перебирает итератор (ids), а затем я заканчиваю итератором, который указывает на конец данных (пустой итератор). Таким образом, я больше не могу использовать этот итератор - в следующих тестах.
Shod spec2/test framework ведут себя так:
Так что, если я использую тест, как это (по некоторым причинам):
ids.size must_== 2;
ids.size must_== 2;
Он потерпит неудачу.
// -
Здесь мы используем метод итератора размер(). Итак, У меня это нормально с таким поведением. Но если использовать такой код:
Ids.toIterable must haveSize(2); // here we do not use iterator.size() method dirrectly
for(id <- ids) println(id).
Ничего не печатает. Кажется, он по-прежнему потребляет мой 'плохой' итератор ..
I found обходным:
val (it1, it2) = ids.duplicate
it1.size must_== 2;
it2.size must_== 2;
И с этим (преобразовать в список), он также будет работать (как было предложил в комментариях):
val ids = for(software <- parser.toList) yield software.productID
Но это именно то, что spec2 можно использовать по умолчанию (для методов, как haveSize
). (я разместил bug).
Почему бы не конвертировать итератор в список? – Antimony
это первое решение, с которым я столкнулся. просто не ожидал и задавался вопросом, почему тест показывает мне правду, но данные пустые послесловия – ses
может быть логичным для spec2 для wok с копией итератора пользователя, но не с оригинальным – ses