There|are| so many| Spock| spec如何使用其标签的示例,例如:
// when -> then label combo
def "test something"() {
when:
// blah
then:
// blah blah
}
此类标签组合为:
when
-〉then
- x1米2米1 x-〉x1米3米1 x-〉x1米4米1 x
expect
given
-〉expect
但我找不到任何文件说明这些标签的 * 合法*/有意义的组合是什么。例如,我是否可以:
def "do something"() {
when:
// blah
expect:
// blah
}
我可以吗?我不知道。那...
def "do something else"() {
when:
// blah
then:
// blah
expect:
// blah
where:
// blah
}
我可以吗?再说一次,我不知道。但我想知道。
1条答案
按热度按时间g2ieeal71#
我实际上是你提到的教程之一的作者。我认为回答你的问题的最好方法是真正理解特定标签的用途。也许这样就能更清楚为什么某些组合有意义而其他组合没有意义。请参考原始文档http://spockframework.github.io/spock/docs/1.0/spock_primer.html。它很好地解释了所有标签及其用途。它还附带了以下图表:
我希望这已经告诉你很多了。例如,同时使用when和expect标签没有多大意义。expect标签被设计为同时替换when和then。其背后的原因在文档中有很好的解释:
expect块[...]在用单个表达式描述刺激和预期响应更自然的情况下很有用。
spock本身不允许你使用这个组合。如果你试图执行下面的代码。
您将收到如下所示的错误消息。
启动失败:/用户/wooki/设计项目/mylibrary/src/测试/groovy/示例测试。13:此处不允许使用"expect";相反,请使用以下选项之一:[然后]@第13行第9栏。
令我惊讶的是,你的第二个例子起作用了,但是我相信在这里使用expect代替我通常使用的和并没有多大好处。
在then之后使用expect或and的唯一原因是为了将负责验证执行when标签内代码的结果的代码分隔开。例如,将以某种方式相互关联的验证分组,或者甚至将单个验证分隔开,但有可能使用可以附加到Spock中的标签的字符串为它们提供描述。
因此,由于您已经声明测试的验证部分已开始(使用**,然后使用块),我将坚持使用和标签来分隔进一步的代码。
关于where标签,它的工作方式类似于一个循环指示符,所以无论你之前使用什么标签组合,你总是可以把where**标签放在最后,这个标签并不是一个测试运行的一部分,它只是强制测试运行多次。
也有可能有这样的东西:
使用上面的方法,只是要确保你的测试没有"测试太多",这意味着这可能是你使用两组when-then的原因,为这个测试实际上被分成两个独立的测试提供了完美的借口。
我希望这至少回答了你的一些问题。