後主動意見的方式,並推斷出了它是如何工作的,我仍然認爲:Specs2打破我的測試數據,由於它與迭代工作
將是很好,不過,如果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),然後我最終與指向數據結束(空迭代器)的迭代器。因此我不能再使用這個迭代器 - 在接下來的測試中。
請問spec2 /測試框架的行爲如何?
所以,如果我用這樣的測試(由於某種原因):
ids.size must_== 2;
ids.size must_== 2;
它會失敗。
// -
這裏我們使用迭代器的size()方法。所以,我有這個沒關係有這樣的行爲。但是,如果使用這樣的代碼:
Ids.toIterable must haveSize(2); // here we do not use iterator.size() method dirrectly
for(id <- ids) println(id).
什麼都不打印。 看來它仍然會消耗我的「差」的迭代器..
我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 2013-05-05 01:38:26
這是我想出的第一個解決方案。只是沒有想到,並想知道爲什麼測試顯示我是真實的,但數據是空的 – ses 2013-05-05 01:45:46
可能是合乎邏輯的spec2用戶的迭代器複製,但不是原來的 – ses 2013-05-05 01:51:40