Groovy Spock单元测试带闭包

时间:2013-10-17 11:37:42

标签: groovy jenkins-plugins spock

我怎么能在Spock / groovy中做到这一点?

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")
        }
    }
}

具体来说,如何使用嵌套测试运行闭包? “另一个字符串”测试不起作用

3 个答案:

答案 0 :(得分: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") }
        }
    }
}

答案 1 :(得分:1)

使用every代替each,或使用嵌套assert

答案 2 :(得分:0)

我不确定我是否理解你的问题。但是,如果通过嵌套测试表示评估每个闭包内的语句,为什么不使用assert

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的方法似乎也很好,而且更像是Spock的方式。我没有测试过它。

修改

如果你想确保所有logFiles都包含测试字符串,那么就像Peter建议的那样使用'every'方法。

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

其他方法,如果您想知道有多少logFiles在测试时不包含测试字符串,则计算它们并将结果大小与零进行比较:

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 == []