Spock标签组合

13

这里 | | 很多 | Spock | 规范 的示例,如使用标签:

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

    then:
    // blah blah
}

如下标签组合:

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

但我找不到文档说明这些标签的合法/有意义的组合是什么。比如,我可以这样吗:

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

    expect:
    // blah
}

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

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

    then:
    // blah

    expect:
    // blah

    where:
    // blah
}

我能吗?再次地,我不知道。但我想知道。

1个回答

20

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

Spock labels

我希望这已经告诉了您很多内容。例如,同时使用whenexpect标签并没有太多意义。 expect标签旨在替代whenthen标签。其背后的原因在文档中有很好的解释:

在需要在单个表达式中描述刺激和期望响应的情况下,expect块[...]非常有用。

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

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

    expect:
        1==1
}

您将收到类似以下的错误信息:

启动失败: /Users/wooki/IdeaProjects/mylibrary/src/test/groovy/ExampleTest.groovy: 13: 此处不允许使用“expect”,请使用以下其中之一:[and, then] @ 第 13 行,第 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
}

使用上述方法,确保您的测试不会"过多测试"。这意味着,也许您使用两组when-then的原因是将该测试分成了两个独立的测试。

希望至少回答了您的一些问题。


谢谢@wooki (+1) - 如果您能更详细地解释一下where标签,我想我就可以了! - smeeb
嗨@smeeb,我会尽力在有更多时间时编辑我的回答。与此同时,您可以查看我以前在Spock中创建的测试。那里有很多参数化测试(带有where标签)。希望这将让您更好地了解它们的功能和用途。 测试在这里 - wooki
虽然我并不是这种方式的粉丝(至少没有适当的文档支持),但在一个测试中结合when/then和expect可能对于操作Stub/Mock作用域以在then when/then & expect块之间不同地重写方法很有用。 - ScientificMethod
它还远未完成,但我已经开始记录我所学习的有关Spock的一切。这里是where标签的一些示例 - ScientificMethod
@wooki,“given”是“setup”的别名吗?我想在“given”之前使用“setup”,但被拒绝了。 - Federico Piazza
@FedericoPiazza 是的,没错。因此,一个人只能同时使用 setupgiven 中的一个,而不能同时使用两者,额外的分组可以通过 and 标签实现。 - wooki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接