2009-12-07 65 views
3

斯卡拉有一些很好的測試庫(Specs,ScalaTest,ScalaCheck)。但是,使用Scala強大的類型系統,在Scala中開發的API的重要部分是靜態表示的,通常以編譯器阻止的一些不受歡迎或不允許的行爲的形式表示。斯卡拉的靜態測試

那麼,什麼是測試編譯器在設計庫或其他API時是否阻止了某些事情的最佳方法?將不應該註釋掉的代碼應該是不可編譯的,然後取消註釋來驗證它。

一個人爲的例子測試列表:

val list: List[Int] = List(1, 2, 3) 
// should not compile 
// list.add("Chicka-Chicka-Boom-Boom") 

是否現有的測試庫,處理這樣的案件嗎?有沒有一種方法可以讓人們使用它?

我正在考慮的方法是將代碼嵌入到三引號字符串或xml元素中,並在我的測試中調用編譯器。調用代碼看起來像這樣:

should { 
    notCompile(<code> 
    val list: List[Int] = List(1, 2, 3) 
    list.add("Chicka-Chicka-Boom-Boom") 
    </code>) 
} 

或者,一起叫上翻譯的expect型腳本線的東西。

回答

7

我創建了一些執行一些代碼片段並檢查解釋器結果的規格。

你可以看看Snippets的特質。我們的想法是在一些org.specs.util.Property [片段]代碼來存儲執行:

val it: Property[Snippet] = Property(Snippet("")) 
"import scala.collection.List" prelude it // will be prepended to any code in the it snippet 
"val list: List[Int] = List(1, 2, 3)" snip it // snip some code (keeping the prelude) 
"list.add("Chicka-Chicka-Boom-Boom")" add it // add some code to the previously snipped code. A new snip would remove the previous code (except the prelude) 

execute(it) must include("error: value add is not a member of List[Int]") // check the interpreter output 

我發現這種方法的主要缺點是翻譯的緩慢。我還不知道如何加速。

Eric。

+0

這是一個很棒的切片。感謝您閱讀我的想法! – 2009-12-07 12:14:04