2013-10-17 82 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