【问题标题】:Spock: Data Pipes, and Variable AssignmentsSpock:数据管道和变量赋值
【发布时间】:2018-03-09 18:19:38
【问题描述】:

来自斯波克documentation

可以根据需要组合数据表、数据管道和变量赋值:

...
where:
a | _
3 | _
7 | _
0 | _

b << [5, 0, 0]

c = a > b ? a : b

这个简单的例子为y 生成一个MissingPropertyException

def test() {
    expect:
        x == 42
    where:
        y = 12
        x << [y + 30, 54 - y]
}

这个例子有什么问题?

【问题讨论】:

    标签: groovy spock data-driven-tests


    【解决方案1】:

    您不能以这种方式混合数据管道和变量分配。让我们看一下源代码。您可以在第 49 行的 org.spockframework.runtime.ParameterizedSpecRunner 类中放置一个断点,然后使用调试器运行测试。您将看到currentFeature 包含两个参数,名称为yx

    您还会注意到,变量名称 x 定义了一个 dataProvider

    这个数据提供者之所以存在,是因为我们已经将x 定义为一个数据管道,因此它必须遍历变量列表并在数据管道的上下文中对其进行评估。在这种情况下,它期望y 变量也被定义为数据管道,因此它可以获取与同一索引关联的值。

    如果您将where: 定义为:

    where:
    y << [12, 12]
    x << [y + 30, 54 - y]
    

    您的测试会成功,因为现在y 变量作为数据提供者存在并且x 的评估值使用第二个数据提供者访问y 的值。

    如何将变量赋值与数据管道结合起来?

    考虑以下示例:

    @Unroll
    def "variable assignment example"() {
        expect:
        x == 42
    
        and:
        c
    
        where:
        y <<  [12, 12]
        x << [y + 30, 54 - y]
        c = y < x
    }
    

    在这种情况下,变量 c 会为数据管道 yx 中的每个元素计算两次。当第一次展开发生时,y = 12x = y + 30 =&gt; 12 + 30 =&gt; 42c 的计算结果为 true,因为 y&lt;x。当第二次展开发生时,12 的值再次分配给 yx 的计算结果为 42 (54 - y =&gt; 54 - 12 =&gt; 42),c 的计算结果再次为 true

    结论

    我看到它可能看起来像简单的y = 12 变量赋值应该通过数据管道评估来发现。不幸的是,它不是那样工作的。当数据管道被评估时,它只能使用来自其他数据管道的值,并且在此上下文中看不到任何变量分配。

    【讨论】:

    • 根据这个答案,“数据管道和变量分配可以根据需要组合”的说法似乎过于慷慨了。
    【解决方案2】:

    我认为在 where 块中不允许分配 y=12。 例如,这个版本有效,两个测试按预期运行:

    class SampleTest extends Specification {
     @Unroll
     def "test"() {
        expect:
        x == 42
        where:
        x << [12 + 30, 54 - 12]
     }
    }
    

    如果您绝对需要分配,以下方法也可以:

    class SampleTest extends Specification {
     @Unroll
     def "test"() {
        expect:
        x == 42
        where:
        x << myfunc()
     }
    
     def myfunc() {
        def y = 12
        [y + 30, 54 - y]
     }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-03-04
      • 1970-01-01
      • 2011-05-28
      • 1970-01-01
      • 2013-11-27
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      • 2011-02-28
      相关资源
      最近更新 更多