Groovy:在shouldFail()的内部时失去$it的作用域
我有一段groovy代码,在实例化一个新的构建对象时检查软件版本字符串的格式是否正确。我有一个要测试的无效生成字符串列表。下面是我的测试代码。我相信这个测试失败是因为我在shouldFail中失去了“it”的范围。我相信这是真的,因为如果我从shouldFail内部打印它,“it”的值总是空的Groovy:在shouldFail()的内部时失去$it的作用域,groovy,Groovy,我有一段groovy代码,在实例化一个新的构建对象时检查软件版本字符串的格式是否正确。我有一个要测试的无效生成字符串列表。下面是我的测试代码。我相信这个测试失败是因为我在shouldFail中失去了“it”的范围。我相信这是真的,因为如果我从shouldFail内部打印它,“it”的值总是空的 void testInValidBuildStrings() { ['4.0..','10.0','11.0. 0.1234-8','9.-.1.1.1','9.foo.0.1'].each
void testInValidBuildStrings() {
['4.0..','10.0','11.0. 0.1234-8','9.-.1.1.1','9.foo.0.1'].each {
shouldFail {
println it //always null
Build test = new Build("productName", it, "123456")};
}
}
下面这个案例的第二个版本可以工作(我假设),因为我首先将“it”赋值给名为build的变量。我认为它的范围在shouldFail()中一定发生了变化,但我不确定是否发生了这种情况
void testInValidBuildStrings() {
['4.0..','10.0','11.0. 0.1234-8','9.-.1.1.1','9.foo.0.1'].each {
def build = it;
shouldFail { Build test = new Build("productName", build, "123456")};
}
}
在尝试迭代shouldFail()时,有没有比我下面所做的更优雅/正确的解决方案?说实话,定义build的额外一行让我很烦恼:)是的,是的。只需说出闭包的参数:
void testInValidBuildStrings() {
['4.0..','10.0','11.0. 0.1234-8','9.-.1.1.1','9.foo.0.1'].each { el ->
shouldFail {
println el
Build test = new Build("productName", el, "123456")};
}
}
shouldFail
有自己的it
——因此您需要区分它们。基本上,这里有两个嵌套闭包。每个闭包都定义了默认变量“it”。在shouldFail闭包中,它的实例没有值。您可以通过从第一个闭包中命名变量来解决这个问题,并在第二个闭包中使用该变量而不是“it”
closure {varName->
secondClosure {
println "$varName is not equal to $it"
}
}
将以下内容显示为工作代码:
void testInValidBuildStrings() {
['4.0..','10.0','11.0. 0.1234-8','9.-.1.1.1','9.foo.0.1'].each {
def build = it;
shouldFail {
Build test = new Build("productName", build, "123456")
}
}
}
我会将其简化为以下内容:
void testInValidBuildStrings() {
['4.0..','10.0','11.0. 0.1234-8','9.-.1.1.1','9.foo.0.1'].each { build ->
shouldFail {
new Build("productName", build, "123456")
}
}
}
非常感谢您的快速回复。我想一定有什么东西是我错过的!仅供参考-我对这个答案投了赞成票,但我想作为一个新用户,我的投票还不可见。@Damon,你的分数太少了,不能投赞成票。请接受我的答案。对于Opal的延迟,我深表歉意。显然,我对投票和接受之间的区别感到困惑。现在应该都准备好了。