コメントを受け取り、それがどのように機能するかを理解した後、私はまだ考えています:
ただし、specs2 がイテレータ用の消耗品とともに非消耗品のロジックを提供する場合は、すばらしいでしょう。iterator.sizeメソッドを直接使用せずに、specs のメソッドを次のように使用する場合のように: haveSize
コードのあるテストがあります:
val ids = for(software <- parser) yield software.productID
//ids.size must_== 2;
ids.foreach(x => println(x))
次の出力が生成されます。
1
2
spec2 check ( ) のコメントを外すids.size must_== 2
と、空の出力が提供されます。
spec2 のようで、イテレータ (ids) を超えると、データの最後を指すイテレータ (空のイテレータ) になります。したがって、次のテストでは、この反復子をもう使用できません。
Shod spec2/test フレームワークはこのように動作しますか?
したがって、このようなテストを使用すると(何らかの理由で):
ids.size must_== 2;
ids.size must_== 2;
それは失敗するでしょう。
//--
ここでは iterator の size() メソッドを使用します。ですから、そのような振る舞いをしても大丈夫だと思います。しかし、次のようなコードを使用する場合:
Ids.toIterable must haveSize(2); // here we do not use iterator.size() method dirrectly
for(id <- ids) println(id).
何も印刷しません。それはまだ私の「貧しい」イテレータを消費しているようです..
回避策を見つけました:
val (it1, it2) = ids.duplicate
it1.size must_== 2;
it2.size must_== 2;
そして、これで(リストに変換)、それも機能します(コメントで提案されたように):
val ids = for(software <- parser.toList) yield software.productID
しかし、これはまさにspec2がデフォルトで使用できるものです(のようなメソッド用haveSize
)。(私はバグを投稿しました)。