2013-11-02 76 views
0

Specs2確實提供了一個containsAllOf匹配器,但我無法按照自己的方式使其工作。我有兩個字符串A和B,我想測試發生在B中的所有字符數存在於A.Specs2:如何測試「abc」是否包含「aabb」的所有內容

我最好的嘗試,到目前爲止是

A.toCharArray.toSeq must containAllOf(B.toCharArray.toSeq) 

但這個失敗,這樣的錯誤

WrappedArray(一個,b,C,d,...)不包含S,一個,V,H,I,...以及 不能包含...

  1. 的WrappedArray確實包含字符據稱它並不根據Specs2
  2. 爲什麼要爲元素測試的必備包含哪些內容?我不想測試相等性,我想測試B是否是A的「子集」(但不在集合的嚴格集合定義中)

如何爲此編寫工作規範場景?

+1

嘗試'A.toSet必須包含AllOf(B.toSet)' - 'toSet'在String上調用將返回字符串中(唯一)Char的Set集合。 – Shadowlands

+0

這不會編譯,'A.toSet.toSeq'等等,並通過測試 - 但是這並不能解釋爲什麼上述不起作用,何時(在我看來)它完全應該:? 「containsAllOf」這個名字顯然並不意味着它們只能被包含一次,並且左側不允許包含比右側更多的字符...... – Leo

+0

嗯,如果containsAllOf返回true,如果第一個序列包含它整個第二個序列的某處,連續而有序。這不是一個「集合」比較,而是一個「Seq」比較。這意味着'A.toSet.toSeq'對於一些輸入可能會失敗(例如,嘗試B =「bbaa」),除非產生的'Seq'被首先排序('A.toSet.toSeq.sorted'等)。 )。 – Shadowlands

回答

0

目前,我選擇這個變體:

B.toSeq.map(c => A must contain(c)) 

我仍然願意接受建議,但如果沒有清潔劑我可能會(第一次)回答我自己的問題。

或者是這種情況下,我懷疑Specs2測試的東西,當它實際上沒有?

+0

現在不能測試,但使用forall呢? –

0

這不使用containsAllOf但應該工作:

/* turn A into a Map for quick contains lookup */ 
val theAs = A.map(x=> (x,x)).toMap 

/* if resulting list has length greater than 0, 
* then there is something in A that is not in B*/ 
B.filterNot(theAs.contains).length must === 0 
+0

感謝您的建議,這當然是有效的。但是對於我來說,對於表達如此簡單情況的測試用例而言,這是一個太多的邏輯;) – Leo

+0

不用擔心:)我希望這仍然可以對某人有所幫助。 – mirandes

相關問題