2012-06-01 61 views
2

我想寫一堆針對Java類庫的測試代碼,我在Scala上使用specs2。對specs2中的測試用例或「shared_examples_for」進行分組

我有一組測試用例應該爲T類的所有子類運行, 但無法找出最佳實現方法。

從Ruby開始,我自然會像在Rspec中那樣尋找類似* shared_examples_for *的宏,但specs2中似乎沒有這樣的東西。

然後我想,繼承我自己的規範子類與測試用例可能是一種方法。

有沒有什麼更整潔的解決方案呢?

回答

3

你可以找到在User Guide共享實例的實例。基本上這使用了一個事實,即你可以定義一個方法來獲取特定的實例來測試和聲明它的例子(參見nonEmptyStack方法)。

如果這可以幫助讓我用一個可變Specification的kickstart你一個簡單的例子:

import org.specs2._ 

class SubclassesSpec extends mutable.Specification { 
    "These examples must pass for all subclasses" >> { 
    subclasses foreach { subclass => examples(subclass) } 
    } 

    /** @return instances of subclasses of type T where T is 
    * the supertype of the classes you want to test */ 
    def subclasses: Seq[T] = ... 

    /** @return examples parameterized by a specific instance */ 
    def examples(t: T) = { 
    "this is the first example" >> { 
     // use t here 
    } 
    "this is the second example" >> { 
     // use t here 
    } 
    } 
} 

你需要檢查你做之前是實例之間可能產生的副作用的唯一的事情。在上面的說明中,所有示例都是同時執行的它們共享同一個對象。如果創建的任何問題,您可以:

  • 在規範的頂部添加sequential避免併發

  • 變化subclassesexamplesdef subclasses: Seq[() => T]def examples(t:() => T)讓你將創建一個全新的實例對於每個示例

+0

我在這裏看不到'例子'上的傳遞點。你在哪裏嘗試了後面提到的副作用守衛,但後來退出並忘記將其刪除? –

+0

你是對的丹尼爾,我相應地編輯了答案。 – Eric

+0

這不適合我。例子的返回類型應該是「片段」嗎?我得到:錯誤:(40,13)找不到類型org.specs2.main.CommandLineAsResult [單位] 「#status」的證據參數的隱式值>> { – Matthias

相關問題