后主动意见,并想出如何它的作品,我仍然认为:
会很好,不过,如果specs2提供非消耗性逻辑,与消费品的迭代器一起。 就像如果我不直接使用iterator.size的方法,但使用规范的方法,如:haveSize
我有一个测试,其中有一个代码:
val ids = for(software <- parser) yield software.productID
//ids.size must_== 2;
ids.foreach(x => println(x))
它产生的输出:
1
2
如果我取消SPEC2检查( ids.size must_== 2
),将与空的输出提供。
这似乎SPEC2,越过迭代器(IDS),然后我结束了迭代器指向数据的末尾(空迭代器)。 因此,我不能再使用这个迭代器 - 在接下来的测试。
SHOD SPEC2 /测试框架,这样的表现?
所以,如果我使用测试这样的(由于某种原因):
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).
打印什么。 现在看来,这仍然消耗我的“穷”的迭代器..
我发现了一个变通办法:
val (it1, it2) = ids.duplicate
it1.size must_== 2;
it2.size must_== 2;
而与此(转换为单),它也将工作(建议在评论等):
val ids = for(software <- parser.toList) yield software.productID
但是,这到底是什么SPEC2可以在默认情况下使用(方法,如haveSize
)。 (我已经发布了一个错误 )。