您不能以这种方式混合数据管道和变量分配。让我们看一下源代码。您可以在第 49 行的 org.spockframework.runtime.ParameterizedSpecRunner 类中放置一个断点,然后使用调试器运行测试。您将看到currentFeature 包含两个参数,名称为y 和x:
您还会注意到,变量名称 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 会为数据管道 y 和 x 中的每个元素计算两次。当第一次展开发生时,y = 12、x = y + 30 => 12 + 30 => 42 和 c 的计算结果为 true,因为 y<x。当第二次展开发生时,12 的值再次分配给 y,x 的计算结果为 42 (54 - y => 54 - 12 => 42),c 的计算结果再次为 true。
结论
我看到它可能看起来像简单的y = 12 变量赋值应该通过数据管道评估来发现。不幸的是,它不是那样工作的。当数据管道被评估时,它只能使用来自其他数据管道的值,并且在此上下文中看不到任何变量分配。