2014-05-17 65 views
0

我正在學習Odersky的Coursera Scala課程,並且在第2課中爲「過濾器」函數編寫單元測試而努力(返回p中包含的一組子集)。我們創建了一個Type別名Set = Int => Boolean。我設法以令人滿意的功能編寫函數,我可以清楚地看到它正在正常工作。我聲稱這是因爲我可以使用提供的printSet函數來處理大量應用的預定義集合和謂詞,並看到預期的結果出現在控制檯中。我知道我們的Type別名是說我們確實只是定義了一個決定集合成員的規則,而不是集合本身。我有一個真正的問題是我不擅長編寫單元測試,我無法想象如何做一個斷言來測試我的過濾器(s:Set,p:Int => Boolean)函數。如何爲「過濾器」函數編寫一個scala單元測試?

我認爲,部分問題是不知道如何比較兩組的問題。試圖從字面上聲稱,從「過濾器」返回的子集等於一個確定的結果,我想這樣的事情:

val sampleSet = List(-1, 0, 1).toSet 
val odd: Set = x => x % 2 != 0 
val sampleResult = List(-1, 1).toSet 
assert(filter(sampleSet, odd).equals(sampleResult)) //nope, doesn't work. Returns false. 
assert(filter(sampleSet, odd) == sampleResult)  //no good either 

怎樣才能簡單地比較兩組是否包含完全相同的值?我是否過於字面?我當然感到非常愚蠢。

任何人都可以向我建議一種方法來爲此編寫單元測試嗎?單元測試沒有評分,而且我已經有了我的功能正常工作,所以我認爲在Coursera榮譽代碼的範圍內要問。即使有一點讓我頭直的暗示將深深感激。

回答

2

的問題是,當你調用List.toSet你回來一個斯卡拉Setscala.collection.immutable.Set),不Set

scala> val sampleResult = List(-1, 1).toSet 
sampleResult: scala.collection.immutable.Set[Int] = Set(-1, 1) 

既然你已經定義filter來回報您Set的對象類型,而不是scala.collection.immutable.Set,它們永遠不會相等。

爲你的方法寫一個正確的測試有點棘手,因爲你的Set是一個函數,可以將任何Int作爲輸入。因爲它是不實際的斷言在一切可能的Int值,你可能是最好關閉只是聲稱一些相關的輸入:

assert(false, filter(sampleSet, odd)(-2)) 
assert(true, filter(sampleSet, odd)(-1)) 
assert(false, filter(sampleSet, odd)(0)) 
... 
+0

燦爛,非常感謝你。我不得不把它們寫成assert(filter(sampleSet,odd)( - 2)),但這正是我需要看到的。如果我只是在scala工作表中完成這些工作,或者我會看到編譯器語句並意識到這一點。來自美國印第安那州的歡呼聲。 – noogrub

相關問題