2013-01-24 51 views
0

我在使用Specs2編寫驗收測試。Specs2/Neo4j - 使用Specs2的ImpermanentGraphDatabase

我想使用ImpermanentGraphDatabase爲了有一個內存中的Neo4j圖;非常適合集成測試。

我設置了Spring的數據Neo4j的和我的春節檔配置包含:

<bean id="graphDatabaseService" class="org.neo4j.test.ImpermanentGraphDatabase" destroy-method="shutdown"/> 

不知選項destroy-method="shutdown"是否正在採取帳戶Specs2,而不是通常的JUnit,爲每個規格的example隔離。

總結:每個example都會有自己的內存圖實例,還是會共享給它們全部?

我想這不適用,因爲specs2對所有這些Spec的示例執行使用相同的Specification實例。實際上,通過Specs2的功能樣式,在一個實例中僅稱爲所有示例的方法。

我也試着實現BeforeExample特性,以清理每個example的數據庫,但是...使用Given/Then/When樣式,似乎整體被認爲是唯一的example。事實上,分離器是^而不是傳統的!,後者代表一個example

我想每一個步驟(GivenWhenThen步驟)之前清理內存數據庫(ImpermanentGraphDatabse

回答

2

我你的問題的理解是,你希望每個組的前給予一個「新鮮」數據庫/當/然後步驟。

爲了做到這一點,你可以:

  • 每組鑑於/前明確指定動作。當/然後步驟

    Step(cleanupDatabase)^
    "A given-when-then example for the addition"^
        "Given the following number: ${1}"  ^number1^
        "And a second number: ${2}"    ^number2^
        "And a third number: ${3}"    ^number3^
                  end^ 
    Step(cleanupDatabase)^
    "A given-when-then example for the addition"^
    "Given the following number: ${1}"  ^number1^
    "And a second number: ${2}"    ^number2^
    "And a third number: ${3}"    ^number3^
                 end 
    
  • 使用的功能申報每個組和地圖每個清理步驟前

    def `first example` =  
        "A given-when-then example for the addition"^
        "Given the following number: ${1}"  ^number1^
        "And a second number: ${2}"    ^number2^
        "And a third number: ${3}"    ^number3^
                   end 
    def `second example` =  
        "A given-when-then example for the addition"^
        "Given the following number: ${1}"  ^number1^
        "And a second number: ${2}"    ^number2^
        "And a third number: ${3}"    ^number3^
                   end 
    
    def is = Seq(`first example`, `second example`).foldLeft(Step():Fragments) { (res, cur) => 
        res^Step(cleanupDatabase)^cur 
    } 
    
  • 使用map function of the Specification做一般

    override def map(fs: =>Fragments) = fs.flatMap { 
        // clean the database at the end of a G/W/T block 
        case f if f == end => Seq(Step(cleanDatabase), end) 
        case other   => Seq(other)  
    } 
    
+0

我喜歡最後一個建議,但最終'()'是'無法訪問的情況下class'(因爲它englobing對象與'私人[specs2]註釋')。 – Mik378

+0

對,我刪除了這個限制,但也檢查了我以前沒有編譯的答案!我將編輯該答案,並使用最新的1.12.4-SNAPSHOT使其更好。 – Eric

+0

酷!謝謝 :) – Mik378