Spock标签组合

sme*_*eeb 10 groovy spock

| | 这么多 | Spock | spec如何使用其标签的示例,例如:

// when -> then label combo
def "test something"() {
    when:
    // blah

    then:
    // blah blah
}
Run Code Online (Sandbox Code Playgroud)

这样的标签组合如下:

  • when - > then
  • given- > when- >then
  • expect
  • given - > expect

但我无处可以找到有关这些标签的合法 /有意义组合的文档.例如,我可以:

def "do something"() {
    when:
    // blah

    expect:
    // blah
}
Run Code Online (Sandbox Code Playgroud)

我可否?我不知道.关于什么:

def "do something else"() {
    when:
    // blah

    then:
    // blah

    expect:
    // blah

    where:
    // blah
}
Run Code Online (Sandbox Code Playgroud)

我可否?再说一次,我不知道.但我想知道.

小智 15

我实际上是您提到的其中一个教程的作者.我认为最好回答你的问题是真正了解特定标签的用途.也许那时为什么某些组合有意义而其他组合没有意义会更明显.请参阅原始文档http://spockframework.github.io/spock/docs/1.0/spock_primer.html.它很好地解释了所有标签及其用途.它还附带此图:

Spock标签

我希望它应该已经告诉了你很多.因此,例如,何时期望标签都没有多大意义.该预期标签被设计来取代这两个随后.其背后的原因在文档中得到了很好的解释:

期望块[...]在单个表达式中描述刺激和预期响应更自然的情况下非常有用.

Spock本身不允许你使用这种组合.如果您尝试执行以下代码.

def "test"() {
    when:
        println("test")

    expect:
        1==1
}
Run Code Online (Sandbox Code Playgroud)

您将收到这样的错误消息.

启动失败:/Users/wooki/IdeaProjects/mylibrary/src/test/groovy/ExampleTest.groovy:13:这里不允许'期望'; 相反,使用以下之一:[和,然后] @第13行,第9列.

令我惊讶的是,你的第二个例子有效.但是我相信在这里使用期望没有太大的收获,而是像往常一样.

def "do something else"() {
    when:
    // stimulus

    then:
    // 1st verification

    and:
    // 2nd verification

    where:
    // parametrization
}
Run Code Online (Sandbox Code Playgroud)

唯一的理由,期望接着是验证内部执行代码的结果分离负责编码的标签.例如,对以某种方式相互关联的验证进行分组,或者甚至将单个验证分开,但有可能使用可附加到Spock中的标签的字符串为其提供描述.

def "do something else"() {
    when:
    // stimulus

    then: "1 is always 1"
       1 == 1

    and: "2 is always 2"
       2 == 2
}
Run Code Online (Sandbox Code Playgroud)

因此,由于您已经开始声明测试的验证部分开始(使用然后阻止),我会坚持标记以分离更多代码.

关于其中的标签.它有点像循环指示器.所以,无论你使用之前,你可以在最后的时刻把标签的组合,其中标签.这个实际上不是单个测试运行的一部分,它只是强制执行测试多次运行.

同样可以有这样的东西:

def "test"() {
    given:
        def value

    when:
        value = 1

    then:
        value == 1

    when:
        value = 2

    then:
        value == 2
}
Run Code Online (Sandbox Code Playgroud)

使用上述方法,只需确保您的测试不是"测试太多".意思是这可能是你使用两组时间的原因 - 然后为这个测试做一个完美的借口,实际上分成两个单独的测试.

我希望至少回答你的一些问题.