2013-10-17 139 views
2

我該如何在Spock/groovy中做到這一點?Groovy Spock單元測試關閉

package org.jenkinsci.plugins 

import hudson.matrix.* 
import spock.lang.* 
import org.junit.Rule 
import org.jvnet.hudson.test.JenkinsRule 

class xxxx extends Specification { 

    @Rule JenkinsRule rule = new JenkinsRule() 

    def 'matrix'() { 
     given: 
     def matrixProject = rule.createMatrixProject() 
     AxisList axl = new AxisList(); 
     def axis = new TextAxis('TEST', "1", "2", "3") 

     axl.add(axis) 
     matrixProject.setAxes(axl) 

     expect: matrixProject.scheduleBuild2(0).get().logFile.text.contains("Some String!") 

     matrixProject.scheduleBuild2(0).get().getRuns().each(){ 
      expect: it.logFile.text.contains("Another String") 
     } 
    } 
} 

具體來說,我該如何運行一個嵌套測試閉包? 「Another String」測試不起作用

回答

0

我不知道我是否理解你的問題。但是,如果通過嵌套測試你的意思是評估每個瓶蓋內聲明,爲什麼不使用斷言

expect: 
matrixProject.scheduleBuild2(0).get().logFile.text.contains("Some String!") 
matrixProject.scheduleBuild2(0).get().getRuns().each() { 
    assert it.logFile.text.contains("Another String") 
} 

@ tim_yates的做法也似乎很好,它更像斯波克的方式。我還沒有測試過它。

編輯

如果你想確保所有的日誌文件包含測試字符串,然後使用「每一個」方法,彼得建議。

expect: 
... 
matrixProject.scheduleBuild2(0).get().getRuns().every { 
    it.text.contains('Another String') 
} 

其他方法,如果你喜歡知道多少日誌文件不包含在測試測試字符串失敗指望他們,並比較結果的大小爲零:

expect: 
... 
matrixProject.scheduleBuild2(0).get().getRuns().count { 
    !it.text.contains('Another String') 
} == 0 

另一種,如果你喜歡知道哪些文件導致測試失敗,讓那些不包含測試字符串的名稱和比較,爲空列表:

expect: 
... 
matrixProject.scheduleBuild2(0).get().getRuns().findAll { 
    !it.text.contains('Another String') 
}*.name == [] 
+0

這是一個,但它只運行到測試失敗,斷言它.logFile.text.contains(「測試/ 1」)'在第二次運行失敗,第三次不會被調用 – KeepCalmAndCarryOn

+0

再次檢查我的答案,我添加了一些其他解決方案。也許有人會爲你的需要更好。 – topr

+0

謝謝 - 我修正了原始問題的邏輯(需要一個setAxes,而不是axis.add() - 並且'every'的作品現在給出'不滿足條件: b.getRuns()。every(){it .logFile.text.contains(「TEST/1」)} | | | | | false | [test0 - 1#1,test0 - 2#1,test0 - 3#1] test0#1 ' – KeepCalmAndCarryOn

1

這是行不通的嗎?

def 'matrix'() { 
    given: 
     def matrixProject = rule.createMatrixProject() 
     def axis = new TextAxis('TEST', "1", "2", "3") 
     matrixProject.axes.add(axis) 

    expect: 
     with(matrixProject.scheduleBuild2(0).get()) { 
      logFile.text.contains("Some String!") 
      runs.every { it.logFile.text.contains("Another String") } 
     } 
    } 
} 
+0

不幸的是,這是行不通的'org.codehaus.groovy.runtime.metaclass.MissingMethodExceptionNoStack:沒有方法的簽名:org.jenkinsci.plugins.xxxxx.with()適用於參數類型:(hudson.matrix.MatrixBuild ,org.jenkinsci.plugins.xxxxxxx $ _ $ spock_feature_0_2_closure3)values:[test0#1,[email protected]] 可能的解決方案:使用(groovy.lang.Closure),wait() ,find(),wait(long),wait(long,int),Mock()'我試過使用'.with {'但是這並沒有 – KeepCalmAndCarryOn

1

要麼使用every代替each,或使用嵌套的assert