1

コメントを受け取り、それがどのように機能するかを理解した後、私はまだ考えています:

ただし、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)。(私はバグを投稿しました)。

4

2 に答える 2

2

iterator.size must_== 2自分でイテレータを消費するように書くと、specs2 は値を受け取るだけです2(イテレータのサイズが 2 の場合)。そのため、specs2 でできることは何もありません。

次に、specs2 に書き込みによってイテレータのサイズを確認するように依頼しiterator must haveSize(2)、イテレータが消費されないようにすることができます。これも良い考えだとは思いません。これは、イテレータを消費する のiterator must haveSize(2)省略形であると合理的に予想されると思います。iterator.size must be_==(2)

私の提案は、何かを消費するかどうかを制御する決定をユーザー コードに任せることです。イテレータをそのままにしておくか、サイズの評価要素のチェックのStream両方を行いたい場合は、イテレータを a に変更できます。

 val iterator = Seq({println(1); 1}, {println(2); 2}).iterator
 val elements = iterator.toStream

 elements must haveSize(2)
 elements(1) === 2
于 2013-05-05T08:54:03.200 に答える