从 where: 块内部访问 Spock 数据提供者变量

Access Spock data provider variable from inside where: block

我正在尝试从 where 块中访问 where 块变量,但它不起作用。我认为 Spock 不允许这样做,但我想我会试一试,看看是否有人知道该怎么做。

where:
testNumber << Stream.iterate(1, n -> n).iterator()
test << Stream.generate(() -> { testNumber > 15 }).iterator()

结果:

No such property: testNumber for class

如果这不可能,并且有人有其他方法可以完成类似的事情,我愿意接受。基本上我试图让这个测试更容易管理,因为跟踪 15-20 个布尔值的多个数组有点痛苦:

testNumber << [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
post << [false, false, false, false, true, true, true, true, true, true, true, true, true, true, true, true]
postWeekend << [true, true, true, true, true, true, false, false, false, false, false, false, false, false, false]
dividendReinvested << [true, false, true, false, true, true, false, true, true, true, true, true, true, true, true]
createCCB << [false, false, false, false, false, false, false, false, false, false, false, false, false, false, true]
ntd << [false, false, false, false, false, false, false, false, false, false, false, false, false, false, false]

但是我可以根据测试编号设置其中的许多,如果我可以访问它的话(并且提供可用的测试编号也可以很容易地确定哪个测试失败了)。

看起来你想根据 testNumber 计算一些东西。 您可以为此使用 data variables

另一个问题是您使用的是无限流,它不会在 jvm 运行 内存不足之前终止。因此,您需要使用 .limit(20) 或仅使用 groovy 范围来更简洁地定义它。

import spock.lang.*

class ASpec extends Specification {
  def "hello world"() {
    expect: 
    testNumber > 15 == test
      
    where:
    testNumber << (1..20)
    test = testNumber > 15 
  }
}

Groovy Web Console 中尝试。

如果这不是您想要的,那么您应该按照@kriegaex 的建议更新您的问题,告诉我们您实际想要实现的目标。

请不要接受这个答案,伦纳德的一个解决了原来的问题。我只是提供更多细节。

Spock 手册解释了如何 access other data variableswhere 块中。

此外,如果在另一种情况下您只需要展开方法名称中的iteration index,而不需要在特征方法本身中,您可以使用#iterationIndex。计数从索引 0 开始。这是一个向您展示的示例:

package de.scrum_master.Whosebug.q70661506

import spock.lang.Shared
import spock.lang.Specification

class ReferringToDataTableVariablesTest extends Specification {
  @Shared
  final n = 8

  def "feature [#iterationIndex]: #testNumber, #testRange"() {
    println "$testNumber, $testRange, ${testClosure()}"

    expect:
    true

    where:
    testNumber << (1..n)
    testRange = testNumber + 3..2 * testNumber
    testClosure = { -> testNumber / 2 > 2 }
  }
}

Groovy Web Console 试试。

在我的 IDE 中,运行 测试如下所示: