我想知道如何在Spock规范中的一行中定义多个变量,如下所示。
我试过了:
import spock.lang.Specification
class exampleSpec extends Specification {
def "foo"() {
when:
def a, b
a = 0
b = 1
then:
a != b
}
}
但访问b时失败:
No such property: b for class: ....
我设法让以下工作:
def (a, b) = []
但我想要更好的东西。
非常感谢任何帮助!
我正在使用:
Groovy Version: 2.4.3 JVM: 1.8.0_45 Vendor: Oracle Corporation OS: Linux
答案 0 :(得分:1)
我担心无法在任何阻止中执行此操作(例如given:
,setup:
,when:
)。有一个简单的工作。
@Grab(group='org.spockframework', module='spock-core', version='0.7-groovy-2.0')
import spock.lang.Specification
class ExampleSpec extends Specification {
def "foo"() {
def a, b
when:
a = 0
b = 1
then:
a != b
}
}
将声明移出when:
/ given:
/ setup:
块,并将其作为方法变量。 setup:
/ given:
标签是可选的,可以省略,从而产生隐式设置块。
虽然这有效,但我想知道为什么这不起作用的原因。您可以创建issue in github。
答案 1 :(得分:1)
您应该使用where:block来传递参数。没有def需要因为它们是作为一个参数传递的,如果你感觉很奇怪,你甚至可以进行多次运行的测试。
def "Use where to pass test data"(){
expect: 1 == myNumber
2 == myOther1
where: myNumber = 1
myOther1 = 2
}
这里是a link我写的其他一些示例,展示了如何将数据传递给测试。如果你真的喜欢多个作业(even though it's not a good idea)here's how,你可以在where:block中使用它。
如果你对这里的各种块感到好奇,那就是a summary我读过的所有内容。不要相信我的话,这是some official文档。
您可能很高兴知道此问题已raised already,但上个月没有看到任何活动。我的假设是,有关多重赋值的内容与Spock在代码中使用的AST转换不一致。