在Spock中的一行中声明多个变量:block

时间:2015-09-24 13:47:04

标签: groovy spock

我想知道如何在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

2 个答案:

答案 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 ideahere's how,你可以在where:block中使用它。

如果你对这里的各种块感到好奇,那就是a summary我读过的所有内容。不要相信我的话,这是some official文档。

您可能很高兴知道此问题已raised already,但上个月没有看到任何活动。我的假设是,有关多重赋值的内容与Spock在代码中使用的AST转换不一致。