Spock 标签组合
Spock label combinations
There | are | so many | Spock | spec 如何使用其标签的示例,例如:
// 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
}
可以吗?再一次,我不知道。但是我想知道。
我实际上是您提到的其中一个教程的作者。我认为最好回答您的问题是真正了解特定标签的用途。也许那时会更明显为什么某些组合有意义而其他组合没有意义。请参考原始文档 http://spockframework.github.io/spock/docs/1.0/spock_primer.html。它很好地解释了所有标签及其用途。它还带有此图表:
我希望这应该已经告诉了你很多。因此,例如同时具有 when 和 expect 标签没有多大意义。 expect 标签旨在替代 when 和 then。其背后的原因在文档中有很好的解释:
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 之后 expect 或 and 的唯一原因是分离负责的代码用于验证 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 的原因可能是将此测试完全分为两个单独测试的完美借口。
我希望这至少能回答您的一些问题。
There | are | so many | Spock | spec 如何使用其标签的示例,例如:
// 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
}
可以吗?再一次,我不知道。但是我想知道。
我实际上是您提到的其中一个教程的作者。我认为最好回答您的问题是真正了解特定标签的用途。也许那时会更明显为什么某些组合有意义而其他组合没有意义。请参考原始文档 http://spockframework.github.io/spock/docs/1.0/spock_primer.html。它很好地解释了所有标签及其用途。它还带有此图表:
我希望这应该已经告诉了你很多。因此,例如同时具有 when 和 expect 标签没有多大意义。 expect 标签旨在替代 when 和 then。其背后的原因在文档中有很好的解释:
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 之后 expect 或 and 的唯一原因是分离负责的代码用于验证 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 的原因可能是将此测试完全分为两个单独测试的完美借口。
我希望这至少能回答您的一些问题。