我有这个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()时,是否有比我下面所做的更优雅/正确的解决方案?说实话,定义构建的额外线条让我烦恼:)
答案 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")
}
}
}