2012-09-11 140 views
1

我有一個具有以下模式Groovy的斯波克方法:古典單元測試作爲Groovy的斯波克方法

def "My test"() { 
    def a = createA(); 
    assert a.fieldLevel1.isValid() 
    def b = a.fieldLevel1 
    assert b.fieldLevel2.isValid() 
    def c = b.fieldLevel2 
    assert c.fieldLevel3.isValid() 
    ... 
} 

正如你可以看到它是很難打破它塊作爲斷言和變量定義混合在一起。編寫這種測試的「spock」​​方法是什麼?

UPDATE:

測試有以下結構,因爲c.fieldLevel3.isValid()實際上是c.fieldLevel3 instanceof A,所以如果該字段是無效的,我不能繼續。

回答

4

單元測試的「經典」方式是保持測試單一。也就是說,測試每項測試有一件事,在這個例子中似乎不是這種情況。

話雖這麼說,但是,你能集團所有斷言在expect塊後,所有的設置代碼在setup塊:

def "My test"() { 
    setup: 
    def b = createA().fieldLevel1 
    def c = b.fieldLevel2 
    def d = c.fieldLevel3 
    expect: 
    b.valid 
    c.valid 
    d.valid 
} 

注意到我使用Groovy的東西來縮短斷言訪問isValid()作爲valid並直接在輔助對象上調用該方法。

此外,我還沒有使用通常的when/then Spock模塊,因爲這個測試案例似乎不能很好地與給定系統上的刺激/響應一致。但你也可以使用許多whenthen交替塊,如果你願意的話:

def "My test"() { 
    when: def b = createA().fieldLevel1 
    then: b.valid 
    when: def c = b.fieldLevel2 
    then: c.valid 
    when: def d = c.fieldLevel3 
    then: d.valid 
} 
1

不知道爲什麼你在上面,它看起來相當不錯不接受的答案。

這樣微小的差別,你也可以這樣做:

def "My test of creating an A"() { 
    when: 
     def a = createA() 
    then: 
     a.fieldLevel1.isValid() 
     a.fieldLevel1.fieldLevel2.isValid() 
     a.fieldLevel1.fieldLevel2.fieldLevel3.isValid() 
} 

無論你是否「喜歡」這取決於你遵循迪米特「法」是如何緊密 - Groovy中似乎讓這不太相關的比過去。

如果實際基礎對象的複雜性不足以驗證它們,那麼它們可能需要進行自己的單元測試。