Groovy:在shouldFail()内部丢失$ it的范围

时间:2015-06-24 20:23:10

标签: groovy

我有这个groovy代码,在实例化一个新的Build对象时检查软件版本字符串是否是正确的格式。我有一个我想测试的无效构建字符串列表。下面是我的测试代码。我相信这个测试失败了,因为我失去了"它的范围。在shouldFail里面。我相信这是真的,因为"它"如果我从shouldFail中打印它,它总是为空。

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")};         
              }
 }

以下案例的第二个版本有效(我假设),因为我已经首先分配了#34;它"变量名为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()时,是否有比我下面所做的更优雅/正确的解决方案?说实话,定义构建的额外线条让我烦恼:)

3 个答案:

答案 0 :(得分:3)

是的,确实如此。只需命名闭包的参数:

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 - 因此您需要区分它们。

答案 1 :(得分:1)

基本上,这里有2个嵌套闭包。每个闭包都有默认变量'它'定义。在shouldFail闭包内,它的实例没有任何价值。您可以通过从第一个闭包中命名变量来解决这个问题,并使用它来代替'它'在第二次关闭。

closure {varName->
  secondClosure {
   println "$varName is not equal to $it"
  }
}

答案 2 :(得分:0)

您将以下内容显示为工作代码:

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")      
        }
    }
}