Spock 标签组合

Spock label combinations

There | are | so many | Spock | spec 如何使用其标签的示例,例如:

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

    then:
    // blah blah
}

标签组合如下:

但是我找不到关于这些标签的合法/有意义组合的文档。例如,我可以:

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

    expect:
    // blah
}

可以吗?我不知道。怎么样:

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

    then:
    // blah

    expect:
    // blah

    where:
    // blah
}

可以吗?再一次,我不知道。但是我想知道。

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

我希望这应该已经告诉了你很多。因此,例如同时具有 whenexpect 标签没有多大意义。 expect 标签旨在替代 whenthen。其背后的原因在文档中有很好的解释:

An expect block [...] is useful in situations where it is more natural to describe stimulus and expected response in a single expression.

Spock 本身不允许您使用此组合。如果您尝试执行以下代码。

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

    expect:
        1==1
}

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

startup failed: /Users/wooki/IdeaProjects/mylibrary/src/test/groovy/ExampleTest.groovy: 13: 'expect' is not allowed here; instead, use one of: [and, then] @ line 13, column 9.

令我惊讶的是,您的第二个示例有效。但是我相信在这里使用 expect 而不是像我通常那样使用 and 真的没有太大好处。

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

    then:
    // 1st verification

    and:
    // 2nd verification

    where:
    // parametrization
}

then 之后 expectand 的唯一原因是分离负责的代码用于验证 when 标签内代码的执行结果。例如,将以某种方式彼此相关的验证分组,或者甚至将单个验证分开,但有可能使用可以附加到 Spock 标签的字符串给它们一个描述。

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

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

    and: "2 is always 2"
       2 == 2
}

因此,由于您已经声明测试的验证部分已经开始(使用 then 块)我会坚持使用 and 标签用于分离进一步的代码。

关于 where 标签。它有点像循环指示器。因此,无论您之前使用什么标签组合,都可以始终将 where 标签放在末尾。这实际上并不是单个测试 运行 的一部分,它只是强制测试 运行 多次。

也可能有这样的东西:

def "test"() {
    given:
        def value

    when:
        value = 1

    then:
        value == 1

    when:
        value = 2

    then:
        value == 2
}

使用上面的方法,只要确保你的测试不是"testing too much"。这意味着您使用两组 when-then 的原因可能是将此测试完全分为两个单独测试的完美借口。

我希望这至少能回答您的一些问题。