从 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 variables 在 where
块中。
此外,如果在另一种情况下您只需要展开方法名称中的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 中,运行 测试如下所示:
我正在尝试从 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 variables 在 where
块中。
此外,如果在另一种情况下您只需要展开方法名称中的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 中,运行 测试如下所示: