Groovy:在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

我有一段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 {
              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的延迟,我深表歉意。显然,我对投票和接受之间的区别感到困惑。现在应该都准备好了。