我实际上是你提到的教程的作者之一。我认为最好回答你的问题是真正理解特定标签的作用。也许这样会更明显,为什么某些组合有意义,而其他组合则没有意义。请参考原始文档http://spockframework.github.io/spock/docs/1.0/spock_primer.html。它很好地解释了所有标签及其目的。此外,它还配有这个图表:
![Spock labels](https://istack.dev59.com/k2fnQ.webp)
我希望这已经告诉了您很多内容。例如,同时使用when和expect标签并没有太多意义。 expect标签旨在替代when和then标签。其背后的原因在文档中有很好的解释:
在需要在单个表达式中描述刺激和期望响应的情况下,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:
then:
and:
where:
}
在then之后使用 expect或and的唯一原因是为了分离负责验证when标签内代码执行结果的代码。例如,将某些相关的验证组合在一起,甚至可以单独分开每个验证,但是可以通过字符串在Spock标签中附加描述信息。
def "do something else"() {
when:
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的原因是将该测试分成了两个独立的测试。
希望至少回答了您的一些问题。
where
标签,我想我就可以了! - smeebsetup
或given
中的一个,而不能同时使用两者,额外的分组可以通过and
标签实现。 - wooki